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


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的with语句使用方法
Sep 21 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
Apr 09 Javascript
jsp网页搜索结果中实现选中一行使其高亮
Feb 17 Javascript
jQuery大于号(>)选择器的作用解释
Jan 13 Javascript
jquery通过closest选择器修改上级元素的方法
Mar 17 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
jquery及js实现动态加载js文件的方法
Jan 21 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
基于复选框demo(分享)
Sep 27 Javascript
vue.js中父组件调用子组件的内部方法示例
Oct 22 Javascript
js实现购物车功能
Jun 12 Javascript
JavaScript实现简易聊天对话框(加滚动条)
Feb 10 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函数的实现原理及性能分析(三)
2015/05/13 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
php 中的closure用法详解
2017/06/12 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
jQuery实现内容定时切换效果完整实例
2016/04/06 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
小程序自定义日历效果
2018/12/29 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
python中的多重继承实例讲解
2014/09/28 Python
python线程池threadpool使用篇
2018/04/27 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Opencv求取连通区域重心实例
2020/06/04 Python
python实现取余操作的简单实例
2020/08/16 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
生产内勤岗位职责
2013/12/07 职场文书
管理工程专业求职信
2014/08/10 职场文书
法学专业毕业实习自我鉴定2014
2014/09/27 职场文书
致运动员加油稿
2015/07/21 职场文书
施工安全责任协议书
2016/03/23 职场文书
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记