1 // 递归算法
 2 template <class T>
 3 void postOrder(void (*visit)(BinTreeNode<T>* t), BinTreeNode<T>* root)
 4 {
 5     if (root != NULL) {
 6         postOrder(visit, root->leftChild);
 7         postOrder(visit, root->rightChild);
 8         visit(root);
 9     }
10 }

 1 /*
 2 非递归算法1.
 3
 4     非递归算法,使用节点的右指针来做判别标志该节点是否是第一次访问,从根节点开始压入所有最左边节点进入堆栈,因为被压入堆栈的过程决定了,当前节点的左子结点已经被访问过了,所以只需判断右子节点。如果右子节点为空可以认为已经访问过了,如果非空,则修改指向右子节点的指针为空,作为已经访问过的标志。
 5
 6 */
 7 template <class T>
 8 void postOrder(void(*visit)(BinTreeNode<T>* t), stack<BinTreeNode<T>*> s)
 9 {
10     BinTreeNode<T>* p = root;
11     s.push(NULL);
12     bool flag = true;
13     do {
14         while (p != NULL) {
15             s.push(p);
16             p = p->leftChild;
17         }
18         while (flag) {
19             if (! s.isEmpty()) {
20                 s.pop(p);
21                 if (p->rightChild == NULL) visit(p);
22                 else {  // 右子节点非空,且未访问过
23                     flag = false;
24                         s.push(p); // 右子节点压回堆栈
25                     BinTreeNode<T>* tmp = p->rightChild;
26                     p->rightChild = NULL;
27                         p = tmp;
28                 }
29             }
30         }
31     } while (! s.isEmpty());
32 }

 1 /*
 2 非递归算法2
 3
 4 要保证根节点在左孩子和右孩子都访问之后才能访问,因此对任一节点P,先将其入栈,如果P没有子女,则可以直接访问它,如果有子女,且其左右孩子都已经访问过了,也可以访问P节点。否则,需要将P的右孩子和左孩子先后入栈,这样保证出栈顺序是先左孩子后右孩子。
 5
 6 acknowledgement: http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
 7 */
 8
 9
10
11 template <class T>
12 void postOrder(void(*visit)(BinTreeNode<T>* t), stack<BinTreeNode<T>*> s)
13 {
14     BinTreeNode<T>* cur = NULL;
15     BinTreeNode<T>* pre = NULL;
16     s.push(root);
17     while (! s.isEmpty()) {
18         cur = s.getTop();
19         if ((cur->leftChild == NULL && cur->rightChild == NULL) || (pre != NULL && (pre = cur->leftChild || pre = cur->rightChild))) {
20             s.pop(cur);
21             visit(cur);
22             pre = cur;
23         } else {
24             if (cur->rightChild != NULL) s.push(cur->rightChild);
25             if (cur->leftChild != NULL) s.push(cur->leftChild);
26         }
27     }
28 }

 1 /*
 2 非递归算法3
 3 构建一个新的struct,加入一个变量visit标示该节点是否被访问过
 4 */
 5
 6 template <class T>
 7 struct newNode {
 8     BinTreeNode<T>* ptr;
 9     int visit;
10     newNode(BinTreeNode<T>* p) : ptr(p), visit(0) {}
11 }
12
13 template <class T>
14 void postOrder(void (visit*)(BinTreeNode<T>* t), stack<newNode<T>*> s)
15 {
16     BinTreeNode<T>* p = root;
17     newNode* np = NULL;
18     do {
19         while (p != NULL) {
20             np = newNode(p);
21             s.push(np);
22             p = p->leftChild;
23         }
24         bool flag = true;
25         while (flag) {
26             s.pop(np);
27             if (np->ptr->rightChild == NULL || np->visit == 1) {
28                 visit(np->ptr);
29             } else {
30                 s.push(np);
31                 flag = false;
32                 np->visit = 1;
33                 p = np->ptr->rightChild;
34             }
35         }
36     } while (! s.isEmpty());
37 }

转载于:https://www.cnblogs.com/shadowwalker9/p/4731878.html

二叉树的后续遍历算法实现相关推荐

  1. 数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法

    (文章篇幅有点长,二叉树的递归遍历算法不作详细分析,但是二叉树的非递归遍历算法和层次遍历算法都有非常详细的分析过程,记得往下翻哦!) 二叉树的递归遍历算法实现 我们首先用递归的方法先序遍历创建这样一棵 ...

  2. 二叉树的层序遍历算法 + 打印二叉树所有最左边的元素(算法)

    二叉树的层序遍历算法 + 打印二叉树所有最左边的元素(算法) 层序遍历 /** * 树结构定义 */ private static class BinaryNode<T> {BinaryN ...

  3. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  4. 二叉树:层次遍历算法(自下而上,从右到左)

    和上一个算法:二叉树:层次遍历算法(自上而下,从左到右)类似,是在上一个的基础上完成的,上一个是自上而下,从左到右,是默认的层次遍历算法. 而与之相反的,本题是自下而上,从右到左的层次遍历,需要借助队 ...

  5. 二叉树几种遍历算法的非递归实现

    二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高.下面对于我学习非递归遍历二叉树算法的过程进行总结 为了便于理解,这里以下图的二叉树为例,分 ...

  6. python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  7. 二叉树先序遍历算法--C语言

    第一次在CSDN上写博客,今天开启自己的编程之路.以前总觉得上课嘛,把老师讲的东西学会,考试能过就好了.但是后来发现,自己被这种想法坑惨了.知识点当时是学会了,但是随着考试的结束,学到的知识也一并还给 ...

  8. 树:二叉树的层序遍历算法(超简洁实现及详细分析)

    实现思路 我们来看看下图的二叉链表 如何实现层序遍历. 层序遍历顺序:ABECDG A为B.E的双亲结点,遍历顺序是 根->左->右 是不是. 而且每个结点都是这样的遍历顺序 有木有.那么 ...

  9. 数据结构(二十)二叉树的递归遍历算法

    一.二叉树的遍历的定义 1.二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问依次.树的结点之间不存在 ...

最新文章

  1. svg 线条动画浅尝
  2. [知了堂学习笔记]_网络基础知识_1.OSI参考模型(网络七层协议)
  3. android6.0权限管理工具EasyPermissionUtil
  4. Chrome 浏览器将登陆 Fuchsia OS
  5. 详解如何实现最基本的AJAX框架
  6. vba模拟鼠标点击_手把手教罗技鼠标宏挂通行证编程
  7. 智能陈桥五笔输入法 for linux,智能陈桥五笔官方版
  8. 【工控老马】洗衣机PLC程序控制系统设计详解
  9. ArcGIS基础学习笔记之空间数据库管理工具ArcCatalog基础
  10. 免费预约!百度全面开放北京地区自动驾驶出租车服务
  11. 国内智能手机市场寒风凛冽,华米OV谁更受伤?
  12. 朝花夕拾 - jsliang 大白前端新年庆
  13. SAP中税码、税率、税务科目的几个表及其中的勾稽关系
  14. 关于陌陌和微信表情页与输入法之间切换的问题
  15. 对学计算机学生礼仪,计算机学院举办“一学一做”之文明礼仪宣传月主题教育活动...
  16. 3D 渲染的 5 种方式
  17. 基于UI组件的Vue可视化布局、快速生成.vue代码
  18. Java系列: 如何在Eclipse中安装Memory Analyzer插件
  19. 甘肃环县村民迁新居不弃良田 建“自乐班”融洽村邻
  20. 计算机中存储单位的编号称号是什么,KB、MB、GB的中文单位名称是什么?

热门文章

  1. abaqus的python安装文件在哪_在abaqus2016中安装xlwt和xlrd库教程
  2. python文件实时同步_python文件自动同步备份v1.2【运维必备】2020/12/31
  3. win10设置默认输入法_为什么说win10越来越好用了?(技巧篇)
  4. 原生 ajax查询,原生ajax啦啦啦
  5. java后台实现自定义排序,java 两种方式实现自定义排序
  6. 圣地亚哥的计算机科学在哪个学院,加州大学圣地亚哥分校计算机科学在哪个学院?...
  7. Linux版rpm与deb格式,如何转换从RPM到DEB和DEB到RPM包使用Alien
  8. (12) ejb学习: JPA的传播属性
  9. Ajax后端极简笔记
  10. 最强N皇后JAVA解题代码