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


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 相关文章推荐
Javascript 原型和继承(Prototypes and Inheritance)
Apr 01 Javascript
实现动画效果核心方式的js代码
Sep 27 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
js实现继承的5种方式
Dec 01 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
用ES6写全屏滚动插件的示例代码
May 02 Javascript
微信小程序绘制图片发送朋友圈
Jul 25 Javascript
vue实现分页加载效果
Dec 24 Javascript
使用Node.js实现base64和png文件相互转换的方法
Mar 11 Javascript
vue实现简单学生信息管理
May 30 Javascript
JS判断数组四种实现方法详解
Jun 29 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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
python使用any判断一个对象是否为空的方法
2014/11/19 Python
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
对python Tkinter Text的用法详解
2018/10/11 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
2019/06/19 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
Python selenium的基本使用方法分析
2019/12/21 Python
django rest framework serializers序列化实例
2020/05/13 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
2014大学生全国两会学习心得体会
2014/03/13 职场文书
论文评语大全
2014/04/29 职场文书
毕业生见习报告总结
2014/11/08 职场文书
好员工观后感
2015/06/17 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
Python函数中的不定长参数相关知识总结
2021/06/24 Python
Python中re模块的元字符使用小结
2022/04/07 Python