zoukankan      html  css  js  c++  java
  • 非递归后序遍历二叉树

    在后序遍历二叉树时,只有遍历完左右子树后才能访问节点元素。故在退栈到根节点时必须判断是左子树还是右子树返回 的。

    若是从左子树返回,还要遍历完右子树,否则,即可访问节点元素。只要将返回到栈顶结点的前一个结点保存到一个变量中,

    判断它是栈顶结点的左孩子还是右孩子就可以区分。

    算法描述:

    typedef struct node
    {
     char data;
     node* lchild;
     node* rchild;
    }Node,*pNode;

    void PostOTraverseNRC(pNode T)
    {
     pNode p=T;
     stack<pNode> STACK;
     do
     {
      while(p!=NULL)
      {//先遍历完当前节点的左子树
       STACK.push(p);
       p=p->lchild;
      }
      while(!STACK.empty()&&STACK.top()->rchild==p)
      {//判断是否是从右子树返回(p当前的值等于栈顶元素的右子树根节点时)
       p=STACK.top();
       STACK.pop();
       VisitTree(p);
      }
      if(!STACK.empty())
      {//遍历右子树
       p=STACK.top()->rchild;
      }
     } while (!STACK.empty());
    }

    参考:孙泽宇, 赵国增, 舒云星《二叉树后序遍历的递归和非递归算法》

  • 相关阅读:
    P1182 数列分段 Section II 题解
    P3853 路标设置题解
    二分模板
    P2678 跳石头题解
    P2440 木材加工题解
    P1024 一元三次方程求解题解
    快速下载vscode的方法
    P1824 进击的奶牛题解
    P1873 砍树题解
    用户登录之asp.net cookie的写入、读取与操作
  • 原文地址:https://www.cnblogs.com/landy126/p/3040908.html
Copyright © 2011-2022 走看看