二叉树的非递归后序遍历算法实例详解


Posted in Javascript onFebruary 07, 2014

前序、中序、后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的,必须有一些额外的信息存放在栈中。
方法有很多,这里只举一种,先定义栈结点的数据结构

typedef struct{Node * p; int rvisited;}SNode //Node 是二叉树的结点结构,rvisited==1代表p所指向的结点的右结点已被访问过。
lastOrderTraverse(BiTree bt){

//首先,从根节点开始,往左下方走,一直走到头,将路径上的每一个结点入栈。

p = bt;

while(bt){


push(bt, 0); //push到栈中两个信息,一是结点指针,一是其右结点是否被访问过


bt = bt.lchild;

}

//然后进入循环体

while(!Stack.empty()){ //只要栈非空


sn = Stack.getTop(); // sn是栈顶结点


//注意,任意一个结点N,只要他有左孩子,则在N入栈之后,N的左孩子必然也跟着入栈了(这个体现在算法的后半部分),所以当我们拿到栈顶元素的时候,可以确信这个元素要么没有左孩子,要么其左孩子已经被访问过,所以此时我们就不关心它的左孩子了,我们只关心其右孩子。


//若其右孩子已经被访问过,或是该元素没有右孩子,则由后序遍历的定义,此时可以visit这个结点了。


if(!sn.p.rchild || sn.rvisited){



p = pop();



visit(p);


}


else //若它的右孩子存在且rvisited为0,说明以前还没有动过它的右孩子,于是就去处理一下其右孩子。


{ 



//此时我们要从其右孩子结点开始一直往左下方走,直至走到尽头,将这条路径上的所有结点都入栈。



//当然,入栈之前要先将该结点的rvisited设成1,因为其右孩子的入栈意味着它的右孩子必将先于它被访问(这很好理解,因为我们总是从栈顶取出元素来进行visit)。由此可知,下一次该元素再处于栈顶时,其右孩子必然已被visit过了,所以此处可以将rvisited设置为1。



sn.rvisited = 1;



//往左下方走到尽头,将路径上所有元素入栈



p = sn.p.rchild;



while(p != 0){




push(p, 0);




p = p.lchild;



}


}//这一轮循环已结束,刚刚入栈的那些结点我们不必管它了,下一轮循环会将这些结点照顾的很好。

}
}
Javascript 相关文章推荐
繁简字转换功能
Jul 19 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
Feb 04 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
使用node.js 获取客户端信息代码分享
Nov 26 Javascript
JS动态修改iframe内嵌网页地址的方法
Apr 01 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 Javascript
JS模拟键盘打字效果的方法
Aug 05 Javascript
jQuery中text() val()和html()的区别实例详解
Jun 28 Javascript
基于jQuery实现一个marquee无缝滚动的插件
Mar 09 Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 Javascript
Select标签下拉列表二级联动级联实例代码
Feb 07 #Javascript
javascript运行机制之this详细介绍
Feb 07 #Javascript
jQuery获取当前对象标签名称的方法
Feb 07 #Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 #Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
Feb 07 #Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 #Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
Feb 07 #Javascript
You might like
PHP文件上传实例详解!!!
2007/01/02 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
在javascript中对于DOM的加强
2013/04/11 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
numpy数组拼接简单示例
2017/12/15 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
Python实现微信小程序支付功能
2019/07/25 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
计算机网络毕业生自荐信
2013/10/01 职场文书
绝对经典成功的大学生推荐信
2013/11/08 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书