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


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 相关文章推荐
JQuery最佳实践之精妙的自定义事件
Aug 11 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
Oct 13 Javascript
JS异常处理的一个想法(sofish)
Mar 14 Javascript
js style动态设置table高度
Oct 21 Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
js获取地址栏参数的两种方法
Jun 27 Javascript
js 执行上下文和作用域的相关总结
Feb 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
收音机术语解释
2021/03/01 无线电
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
python中如何使用朴素贝叶斯算法
2017/04/06 Python
答题辅助python代码实现
2018/01/16 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python编写俄罗斯方块
2020/03/13 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
环卫工人先进事迹材料
2014/06/02 职场文书
2014年个人委托书范本
2014/10/13 职场文书
雷锋的观后感
2015/06/10 职场文书
成事在人观后感
2015/06/16 职场文书
自书遗嘱范文
2015/08/07 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
Go使用协程交替打印字符
2021/04/29 Golang