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


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 计算当天是本年本月的第几周
Mar 22 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
Jul 25 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
Jun 12 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
Sep 04 Javascript
AngularJS equal比较对象实例详解
Sep 14 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
手机端js和html5刮刮卡效果
Sep 29 Javascript
AngularJS中使用ngModal模态框实例
May 27 Javascript
ES7中利用Await减少回调嵌套的方法详解
Nov 01 Javascript
JavaScript实现五子棋游戏的方法详解
Jul 08 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python库安装速度过慢解决方案
2020/07/14 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
给物业的表扬信
2014/01/21 职场文书
公益广告宣传方案
2014/02/28 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
个人职业及收入证明
2014/10/13 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
心术观后感
2015/06/11 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers