二叉树先序创建,先序、中序、后序遍历递归算法和非递归算法

#include <stdio.h>
#include <stdlib.h>
#define MAX 100


typedef struct tnode{
    char data;
    struct tnode *lchild;   
    struct tnode *rchild;  
}TNode, *TLink;



typedef struct node{
    TLink tree_add;     
    struct node *next;
}Node, *Link;


enum return_val {EMPTY_OK  = 1000, EMPTY_NO};

void is_malloc_ok_node(Link node)    
{
    if(node == NULL)
    {
        printf("malloc error\n");
        exit(-1);
    }
}

void create_new_node(Link *node)			//创建节点
{
    *node = (Link)malloc(sizeof(Node));
    is_malloc_ok_node(*node);
}


void create_stack(Link *stack)     //创建栈
    create_new_node(stack);
    (*stack)->next = NULL;
}

void push_stack(Link stack, TLink tree_add) 		//进栈
{
    Link node;
    create_new_node(&node);
    node->tree_add = tree_add;
    node->next = stack->next;
    stack->next = node;
}

int is_empty_stack(Link stack)     //判断栈空
{
    if(stack->next == NULL)
    {
        return EMPTY_OK;
    }
}

int  pop_stack(Link stack, TLink *tree_add) //出栈   
{
    Link p;

    if(is_empty_stack(stack) == EMPTY_OK)   
    {
        return EMPTY_OK;
    }
    *tree_add = stack->next->tree_add;      
    p = stack->next;
    stack->next = p->next;
    free(p);
    return EMPTY_NO;
}

int get_stack_top(Link stack,TLink *tree_add)   //获取栈顶元素
{
    if(is_empty_stack(stack) == EMPTY_OK)
    {
        return EMPTY_OK;
    }
    *tree_add = stack->next->tree_add;
    return EMPTY_NO;
}




void create_queue(Link *front, Link *rear)	//创建队列
{
    create_new_node(front);
    *rear = *front;
    (*front)->next = NULL;
}

void push_queue(Link *rear, TLink tree_add)	//进队
{
    Link node;
    create_new_node(&node);
    node->tree_add = tree_add;
    node->next = (*rear)->next;
    (*rear)->next = node;
    *rear = node;
}


int is_empty_queue(Link front)    //判断是否队空
{
    if(front->next == NULL)
    {
        return EMPTY_OK;
    }
}


int pop_queue(Link front, Link *rear, TLink *tree_add)	//出队
{
    Link p;
    if(is_empty_queue(front) == EMPTY_OK)  
    {
        return EMPTY_OK;
    }
    *tree_add = front->next->tree_add;
    p = front->next;
    front->next = p->next;
    if(p->next == NULL)    
    {
        *rear = front;
    }
    free(p);
    return EMPTY_NO;
}


/*非递归遍历*/
void display_first(TLink tree_node)	//先序
{
    Link stack;
    create_stack(&stack);      

    while(tree_node != NULL || is_empty_stack(stack) != EMPTY_OK)   
    {
        while(tree_node != NULL)    
        {
            push_stack(stack, tree_node);   
            printf(" %c", tree_node->data);  
            tree_node = tree_node->lchild;
        }
        pop_stack(stack,&tree_node);    
        tree_node = tree_node->rchild; 
    free(stack);
}


void display_mid(TLink tree_node)		//中序
{
    Link stack;
    create_stack(&stack);

   
    while(tree_node != NULL || is_empty_stack(stack) != EMPTY_OK)
    {
        while(tree_node != NULL)      
        {
            push_stack(stack, tree_node);
            tree_node = tree_node->lchild;
        }
        pop_stack(stack, &tree_node);
        printf(" %c", tree_node->data); 
        tree_node = tree_node->rchild;
    }
    free(stack);
}


void display_last(TLink tree_node)		//后序
{
    Link stack;
    TLink prior_add, root;
    root = tree_node;
    create_stack(&stack);
    
    while(tree_node != NULL || is_empty_stack(stack) != EMPTY_OK)
    {
        while(tree_node != NULL)   
        {
            push_stack(stack,tree_node);
            tree_node = tree_node->lchild;
        }
        if(get_stack_top(stack, &tree_node) == EMPTY_OK)
        {
            break;
        }                                   
        if(tree_node->rchild == NULL)       
        {
            pop_stack(stack, &tree_node);  
            prior_add = tree_node;         
            printf(" %c", tree_node->data); 
        }
        if(get_stack_top(stack, &tree_node) == EMPTY_OK)    
        {
            break;
        }
        if(tree_node->rchild == prior_add)  
        {
            pop_stack(stack, &tree_node);   
            prior_add = tree_node;          
            printf(" %c", tree_node->data);
        }
        if(get_stack_top(stack, &tree_node) == EMPTY_OK)   
        {
            break;
        }
        if(tree_node == root && tree_node->rchild == prior_add)
         {
            pop_stack(stack, &tree_node);       
            printf(" %c", tree_node->data);
            break;                              
        }
        else
        {
            tree_node = tree_node->rchild;     
         }
    }
    free(stack);
}



void display_level(TLink tree_node)		//层序
{
    Link front, rear;
    int i = 0;
    create_queue(&front, &rear);       
    push_queue(&rear, tree_node);    
    while(is_empty_queue(front) != EMPTY_OK)      
    {   
        pop_queue(front,&rear, &tree_node);        
        printf(" %c", tree_node->data);
        if(tree_node->lchild != NULL)              
        {
            push_queue(&rear,tree_node->lchild);
        }
        if(tree_node->rchild != NULL)
        {
            push_queue(&rear, tree_node->rchild);
        }
    }
    free(front);
}

void is_malloc_ok_tree(TLink tree_node)
{
    if(tree_node == NULL)
    {
        printf("malloc error\n");
        exit(-1);
    }
}



void create_tree(TLink *tree_node)		//先序创建树
{
    char n;
    scanf("%c", &n);
    getchar();
    if(n == '#')            
    {
        *tree_node = NULL;
    }
    else
    {
        *tree_node = (TLink)malloc(sizeof(TNode));  
        is_malloc_ok_tree(*tree_node);
        (*tree_node)->data = n;
        create_tree(&(*tree_node)->lchild);     
        create_tree(&(*tree_node)->rchild);    
    }
}

/*递归遍历*/
/*void display_first(TLink tree_node)	//先序
{
    if(tree_node != NULL)
    {
        printf(" %c", tree_node->data);      
        display_first(tree_node->lchild);
        display_first(tree_node->rchild);
    }
    else
    {
        return;
    }
}

void display_mid(TLink tree_node)		//中序
{
    if(tree_node != NULL)
    {
        display_mid(tree_node->lchild);
        printf(" %c",tree_node->data);    
        display_mid(tree_node->rchild);
    }
    else
    {
        return;
    }
}

void display_last(TLink tree_node)		//后序
{
    if(tree_node != NULL)
    {
        display_last(tree_node->lchild);
        display_last(tree_node->rchild);
        printf(" %c",tree_node->data);     
     }
    else
    {
        return;
    }
}*/

int main()
{
    TLink root;

    create_tree(&root);
    display_first(root);
    printf("\n");
    display_mid(root);
    printf("\n");
    display_last(root);
    printf("\n");
    display_level(root);
    printf("\n");
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉树遍历有三种方式:先序遍历中序遍历后序遍历非递归算法实现二叉树遍历需要借助栈来实现。 以先序遍历为例,具体实现步骤如下: 1. 创建一个栈,将根节点入栈。 2. 当栈不为空时,取出栈顶元素并访问它。 3. 如果该节点有右子树,则将右子树入栈。 4. 如果该节点有左子树,则将左子树入栈。 5. 重复步骤2-4,直到栈为空。 中序遍历后序遍历实现方式类似,只需要在访问节点的时机上稍作调整即可。 下面是先序遍历中序遍历后序遍历非递归算法实现代码: ```c++ // 先序遍历 void preOrder(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> s; s.push(root); while (!s.empty()) { TreeNode* node = s.top(); s.pop(); visit(node); if (node->right != nullptr) s.push(node->right); if (node->left != nullptr) s.push(node->left); } } // 中序遍历 void inOrder(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> s; TreeNode* node = root; while (node != nullptr || !s.empty()) { while (node != nullptr) { s.push(node); node = node->left; } node = s.top(); s.pop(); visit(node); node = node->right; } } // 后序遍历 void postOrder(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> s; TreeNode* node = root; TreeNode* lastVisited = nullptr; while (node != nullptr || !s.empty()) { while (node != nullptr) { s.push(node); node = node->left; } node = s.top(); if (node->right == nullptr || node->right == lastVisited) { visit(node); s.pop(); lastVisited = node; node = nullptr; } else { node = node->right; } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值