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


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同比例缩放图片的小例子
Oct 30 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 Javascript
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
认识less和webstrom的less配置方法
Aug 02 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 Javascript
js中的reduce()函数讲解
Jan 18 Javascript
vue多次循环操作示例
Feb 08 Javascript
生成无限制的微信小程序码的示例代码
Sep 20 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
Mar 04 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
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
竞选大队干部演讲稿
2014/09/11 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
写给导师的自荐信
2015/03/06 职场文书
优秀员工自荐书
2015/03/06 职场文书
保研导师推荐信
2015/03/25 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB