二叉树后序遍历非递归算法与递归算法

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

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;

}
 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值