关于二叉树后序遍历非递归算法详解

本文介绍了一种非递归实现二叉树后序遍历的方法,通过使用两个栈实现了对二叉树节点的遍历,并详细解释了算法流程及代码实现。

二叉树后序遍历非递归详解

1.      首先给出一颗二叉树,如下图所示:


图1 一颗简单的二叉树

根据二叉树的后序遍历的特性,该二叉树后序遍历顺序为:

D G E B H I F C A

2.      一般遍历一颗二叉树,先序中序或者后序,大家最喜欢也最熟悉的方法是采用递归的形式来描述,但是在面试或者笔试的过程中,面试官一般都会要求采用非递归形式的二叉树遍历过程。我们先给出二叉树的递归形式(以后序遍历为例子),然后给出二叉树的非递归形式。

Void postOrder(BiTree root){

If(root!=NULL){

   postOrder(root->left);

   postOrder(root->right);

   cout<<root->data<<”\t”;

}

}

3.      二叉树中序非递归写法如下,先给出代码,后面会具体给出代码分析:

voidpostOrderRecursive(PTreeT root)

{

    if (!root) return;

    stack<PTreeT> s1,s2;//建立两个工作栈;

    PTreeT p=NULL;//工作指针

    s1.push(root);//将根节点压入栈s1中;

    while (!s1.empty())

    {

             p=s1.top();   //将p指向s1中的栈顶元素;

             s1.pop();     //将保存在栈s1中的根节点出栈;

             s2.push(p);  //将s1中的栈顶元素压入栈s2中;             

             if (p->left) //判断当前节点p的左子树是否为空,不为空则压入栈s1;

             {

                      s1.push(p->left);

             }

             if (p->right)//判断当前节点p的右子树是否为空,不为空则压入栈s1;

             {

                      s1.push(p->right);

             }

    }

    while (!s2.empty())//所有的节点在上面的循环完成之后都已经压入栈s2中,现在只需要输出栈s2中的元素,就是后序遍历;

    {                

      

             cout<<s2.top()->data<<"\t";

             s2.pop();       

    }

   cout<<endl;

}

4.      二叉树中序非递归算法的流程图如下:



 

5.      对于上面的图,我们可以对它进行追踪其非递归的执行过程,按照流程图进行追踪应该比价简单,参见前面两章的追踪过程。

6.      运行结果如下图所示:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值