二叉树的后序遍历(非递归算法)

/*
    后序遍历(非递归算法)
    ①先序遍历顺序:根节点-左孩子-右孩子
    ②后序遍历顺序:左孩子-右孩子-根节点
    ③后序遍历倒过来:根节点-右孩子-左孩子
    ①和③对比发现,访问顺序只有左孩子和右孩子颠倒了一下
    思路:
        第一步,将二叉树按照先序非递归算法进行遍历,
        注意在入栈的时候左右孩子入栈的顺序,先左后右 。
        第二步,将遍历得到的结果进行倒置。 
     
*/ 
 

void Postorder (BTNode* bt)
{
    BTNode* Stack1[maxSize];
    BTNode* Stack2[maxSize];//用于将访问的元素倒置 
    int top1 = -1;
    int top2 = -1;
    BTNode* p = bt;
    if(p == NULL)
    {
        return;
    }
    top1 ++;
    Stack1[top1] = p;//根节点入栈 
    while(top1 > -1)
    {
        p = Stack1[top1];//出栈一个元素 
        top1--;
        top2++;
        Stack2[top2] = p;//重点,出栈的结点不直接访问,而是放到另一个栈中 
        if(p->lchild != NULL)
        {  
            top1++;
            Stack1[top1] = p->lchild;//当前结点左孩子入栈
        }
        if(p->rchild != NULL)
        {
            top1++;
            Stack1[top1] = p->rchild;//当前结点右孩子入栈
        }
    }
    while(top2 > -1)//依次出栈,相当于把栈中的元素倒置 
    {
        Visit(top2);//访问该结点 
        top2--;
    }    
}

 

    原文作者:递归算法
    原文地址: https://blog.csdn.net/qq_37677421/article/details/82633785
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞