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

#include <stdio.h>
#include <malloc.h>

//树结构 
typedef struct kl
{
    int data;
    struct kl *lchild;
    struct kl *rchild;
}bittree;


//栈结构 
typedef struct ji
{
    int top;
    bittree **data;
    int size;
}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;    
    }    
}

//创建树
bittree *createtree()
{
    bittree *root = NULL;
    int num;
    printf("Please input number:");
    scanf("%d",&num);
    if(num > 0)
    {
        root = (bittree*)malloc(sizeof(bittree));
        root->data = num;
        root->lchild = createtree();
        root->rchild = createtree();
    }
}


//栈的操作 判满
int isfull(stack *stack)
{
    return stack->top == stack->size-1;

//栈的操作 判空
int isempty(stack *stack)
{
    return stack->top == -1; 
}

//栈的操作 入栈 
void input(stack *stack,bittree *root)  
{
    if(isfull(stack)) return; 
    stack->top++;
    stack->data[stack->top] = root;
}

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

//栈的操作 返回栈顶元素
bittree *top(stack * stack)
{
   int index;
   if(stack->top==-1) return NULL;
    index=stack->top;
    return stack->data[index];

void midvisitbystack1(bittree *root)//已做演示  
{
    if(root == NULL)
        return ;
    
    stack stack;
    init(&stack,50); //一直到这一步差不多都是一样的 
      
    while(root != NULL)
    {
        input(&stack,root);
        root = root->lchild;     //把最左边的一列树的数据全部存入  
    }    
    
    while(!isempty(&stack))
    {
        root = out(&stack);     //一一读出 当读出的这个树有有孩子时 就可以让它等于它的右孩子  
        printf("%5d",root->data);    //然后再把这个右孩子最左边的一列树的数据全部存入 这样循环就解决了   
        if(root->rchild != NULL)
        {
            root = root->rchild;
            while(root != NULL)
            {
                input(&stack,root);
                root = root->lchild;    
            }
        }
    }
}

 

void midvisitbystack2(bittree *root)//已做演示 
{
    stack stack;
    init(&stack,50);
    
    if(root == NULL)
        return ;
    //中序是左右中 那么再栈中就是 右中左  
    input(&stack,root); //注意的地方1 
    while(!isempty(&stack))
    {
        root = out(&stack);
        if (root == NULL)     return;
        //变的地方就是 先存入根 到了后面读出了根  然后存入右孩子 最后又存入了根   
        //还有一个关键条件是 如果这个数据是叶子 或者是 栈顶元素 那么就可以打印 
        if(root->lchild == NULL&&root->rchild == NULL || !isempty(&stack)&&root->rchild == top(&stack))
        {
            printf("%5d",root->data);
            continue;
        } 
            
        input(&stack,root->rchild);  //右 
        input(&stack,root);//注意的地方2   中 
        if(root->lchild != NULL)    
            input(&stack,root->lchild); //左        
    }

 

 
 
int main()
{
    bittree *root = createtree();
    midvisitbystack2(root);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值