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


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 相关文章推荐
js 刷新页面的代码小结 推荐
Apr 02 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
javascript full screen 全屏显示页面元素的方法
Sep 27 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
May 13 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
JS原生数据双向绑定实现代码
Aug 14 Javascript
javascript基本常用排序算法解析
Sep 27 Javascript
jQuery 实现批量提交表格多行数据的方法
Aug 09 jQuery
JS实现的类似微信聊天效果示例
Jan 29 Javascript
javascript实现切割轮播效果
Nov 28 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
May 09 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
Aug 24 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的控制语句
2006/10/09 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
js函数调用的方式
2014/05/06 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python采用Django制作简易的知乎日报API
2016/08/03 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
python实现图片转字符画
2021/02/19 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
民事上诉状范文
2015/05/22 职场文书
收入证明申请书
2015/06/12 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL