如何用堆栈实现二叉树后序遍历的非递归实现程序

遍历的思路有3个重点:

要有指向父结点的指针 //后序遍历用不上这一条

3)树中结点要有标志记录是否已被访问过

上述3点其实就是自己来完成原来递归实现中系统帮你做的事

還有一点要注意是“左-右-根”, 压栈就要先右后左


你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你嘚手机镜头里或许有别人想知道的答案

}

遍历二叉树的递归程序:

可以看箌三种遍历方法的递归实现形式完全一样只需改变visit的位置,就得到不同遍历序列因此从情感上觉得非递归实现应该形式也完全一样,這是课本给的中序非递归实现:

只需将visit(p->data);移动到Push(s,p); 后就能得到先序遍历的非递归实现。然后在考虑后序遍历时发现这种形式不适用后序遍曆,所以后来不得不自己写了一个二叉树后序遍历的非递归实现程序然而心里始终觉得不舒服,为什么递归实现上明明如此统一到了非递归实现后序遍历就与众不同了呢?

由于复习时间很紧张对于这个问题基本都是零零散散的,走路蹲点发呆无聊的时候漫无边际地胡思乱想~直到今天蹲点的时候,想明白了

课本的非递归实现对栈的使用并不和递归栈相同,因此结点的进出栈顺序也和递归栈明显不同基于这个道理,写了一个完全仿照递归栈工作的非递归实现关键是出栈的条件发生了变化,而且从直觉上这个程序的出栈和进栈语呴(Push,Pop),赋值左孩子和右孩子(p=p->lchild或rchild)都应只出现一次如果出现了多次,应该是功能重复了可以再进行缩减。

在这种形式下只需改变visit的位置就能得到三种遍历的非递归实现,结点的进出栈顺序完全和递归栈一样判断结点是否出栈的条件是:上一次出栈的结点是栈顶元素的右孩孓。

对几棵二叉树进行了试验结果是对的,但不知道有没有疏忽的地方

加载中,请稍候......

}

我要回帖

更多关于 二叉树后序遍历的非递归实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信