非递归遍历二叉树

来源:互联网 发布:django网站开发源码 编辑:程序博客网 时间:2024/05/16 16:11

/*
名称:非递归遍历二叉树
说明:以前写过一个非递归遍历二叉树的程序,这次和上次的基本流程差不多。
不过采取的方法有些不一样,上次是利用新的存储结构,添加了一个标志位来判断返回的位置,即是从左子树还是右子树返回的。

这里采用的是一个指针,一直指向上一次访问的结点(初始为空)。在这里,子树返回有四种情况,程序中采取的处理方法分别如下:(1)、是从左子树返回:返回栈顶指针,判断右子树情况。(2)、从右子树返回,而且右子树不为空且不是上一个访问的元素(r中保存):访问右子树。(3)、从右子树返回,右子树为空:访问当前结点(4)、从右子树返回,右子树不为空但是是上一个访问的元素:访问当前结点这里(3)(4)两种情况处理方式一样,在程序中放在一起处理了。还要注意一点的就是,(3)(4)情况中访问p之后,需要把p设为空,否则会重复访问造成死循环。

*/

//非递归后序遍历二叉树void PostOrder4(BiTree T){    stack<BiTNode *> _sta;    BiTNode *p = T,*r = NULL;    while(p != NULL || !_sta.empty())    {        if(p != NULL)        {            _sta.push(p);            p = p->lchild;      //转向左子树        }        else        //右结点        {            p = _sta.top();     //获取栈顶元素            if(p->rchild != NULL && p->rchild != r )                p = p->rchild;            else            {                 cout<<p->data<<" ";    //输出                 r = p;             //r指向当前结点,准备开始下一轮循环                 _sta.pop();                 p = NULL;      //此处p要设为空,否则下一轮循环会继续遍历p的左子树,而我们需要的是开始遍历栈中的下一个元素            }        }    }}
原创粉丝点击