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


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 cookie插件代码类
May 26 Javascript
javascript最常用与实用的创建类的代码
Aug 12 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
js操作滚动条事件实例
Jan 29 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
Apr 29 Javascript
简单模拟node.js中require的加载机制
Oct 27 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
Apr 11 Javascript
微信小程序自定义导航隐藏和显示功能
Jun 13 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
JS ES6异步解决方案
Apr 29 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
Function eregi is deprecated (解决方法)
2013/06/21 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
Textarea输入字数限制实例(兼容iOS&安卓)
2017/07/06 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
收集的几个Python小技巧分享
2014/11/22 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
优秀老师事迹材料
2014/02/05 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
社保转移委托书范本
2014/10/08 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
小学教学工作总结2015
2015/05/13 职场文书
邹越演讲观后感
2015/06/15 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Python中22个万用公式的小结
2021/07/21 Python