关闭

后序遍历非递归

140人阅读 评论(0) 收藏 举报
分类:
leetcode中有这么一道题,非递归来实现二叉树的后序遍历。

二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态。显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root。

                                A

                         B             C

                   D        E                 H

                                   F

后序序列:DFEBHCA
对应代码里的栈s 入栈顺序: 自己对应代码进行模拟
方法1:
对于节点p可以分情况讨论
1. p如果是叶子节点,直接输出
2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
3. p如果有孩子,而且孩子都已经访问过,则访问p节点
 
如何来表示出p的孩子是否都已经访问过了呢?
pre表示刚刚访问过的结点,如果等于当前访问结点的孩子,就表示p的孩子都已经都访问过了,因为在栈里边,父节点是先进后出的。
pre!=NULL&&(pre==cur->lchild||pre==cur->rchild
代码如下
void postOrder3(BinTree *root)     //非递归后序遍历
{
    stack<BinTree*> s;
    BinTree *cur;                      //当前结点 
    BinTree *pre=NULL;                 //前一次访问的结点 
    s.push(root);
    while(!s.empty())
    {
        cur=s.top();
        if((cur->lchild==NULL&&cur->rchild==NULL)||
           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
        {
            cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过 
              s.pop();
            pre=cur; 
        }
        else
        {
            if(cur->rchild!=NULL)
                s.push(cur->rchild);
            if(cur->lchild!=NULL)    
                s.push(cur->lchild);
        }
    }    
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:78564次
    • 积分:3598
    • 等级:
    • 排名:第9152名
    • 原创:285篇
    • 转载:45篇
    • 译文:1篇
    • 评论:15条
    最新评论