C++二叉树后序非递归遍历(三种方法)

#include <stdio.h>
#include <malloc.h>
typedef struct k
{
    int data;
    struct k *lchild;
    struct k *rchild;
}bittree;

typedef struct kl
{
    int top;
    int size;
    bittree **data;
}stack;

//初始化栈
void init(stack *stack,int size)
{
    stack->size = size;
    stack->top = -1;
    stack->data = (bittree**)malloc(size*sizeof(bittree*));
    for(int i = 0 ; i < size ; i++)
    {
        stack->data[i] = NULL;
    }
}

//判空
int empty(stack *stack)
{
    return stack->top == -1;
}

//判满
int full(stack *stack)
{
    return stack->top = stack->size -1;
}

//入栈
void add(stack *stack,bittree *root)
{
    if(stack->size == 0)    return ;
     
    stack->top++;
    stack->data[stack->top] = root;
}

//出栈
bittree *out(stack *stack)
{
    return stack->data[stack->top--];

//返回栈顶元素
bittree *top(stack *stack)
{
    return stack->data[stack->top];
}

//建树
bittree *create()
{
    bittree *root = NULL;
    int num;
    scanf("%d",&num);
    if(num > 0)
    {
        root = (bittree*)malloc(sizeof(bittree));
        root->data = num;
        root->lchild = create();
        root->rchild = create();
    }
    return root;

 
 
//后序1
void lastvisit1(bittree *root)
{
    if(root == NULL)    return;
    stack stack;
    init(&stack,50);
    
    bittree *token = NULL;
    
    add(&stack,root);
    while(!empty(&stack))
    {
        root = out(&stack);
        //条件是 1.叶子 2.右孩子为上一次打印出来的节点 3.有孩子为空,左孩子为上一次打印出来的节点
        //1和2条件 是以左部分树为标准的 3条件是在左半部分的条件基础上对右半部分所需条件的补充 
        if((root->lchild==NULL&&root->rchild==NULL) || root->rchild==token || (root->rchild==NULL&&root->lchild==token))
        {
            printf("%5d",root->data);
            token = root;
            continue;
        }
        add(&stack,root);
        if(root->rchild!=NULL) add(&stack,root->rchild);
        if(root->lchild!=NULL) add(&stack,root->lchild);
    }
}

void lastvisit2(bittree *root)
{
    if(root == NULL) return;
    stack stack;
    init(&stack,50);
    bittree *token = NULL;
    while(root != NULL)
    {
        add(&stack,root);
        root = root->lchild;
    }
    
    while(!empty(&stack))
    {
        root = out(&stack);
        //这里的条件同上 只不过存入节点的次序不同  
        if((root->lchild==NULL&&root->rchild==NULL) || root->rchild==token || (root->rchild==NULL&&root->lchild==token))
        {
            printf("%5d",root->data);
            token = root;
            continue;
        }
        if(root->rchild!=NULL)
        {
            add(&stack,root);
            root = root->rchild;
            while(root != NULL)
            {
                add(&stack,root);
                root = root->lchild;
            }
        }
    }
}


void lastvisit3(bittree *root)
{
    if(root == NULL)    return;
    stack stack;
    init(&stack,50);
    while(root != NULL)
    {
        add(&stack,root);
        root=root->lchild;
    }
    bittree *token = NULL;
    while(!empty(&stack))
    {
        root = out(&stack);
        if(root->rchild==NULL || root->rchild==token)//精简化的条件 
        {
            printf("%5d",root->data);
            token = root;
            continue;
        }
        if(root->rchild != NULL)
        {
            add(&stack,root);
            root=root->rchild;
            while(root!=NULL)
            {
                add(&stack,root);
                root = root->lchild;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值