二叉树非递归后序遍历算法(C语言)

二叉树后序遍历的规律:左右根
后序非递归遍历中,访问根(子根)结点有两种情况
①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的指针。
②遍历完右子树,需要访问根(子根)结点。
基于这个特性,我们需要区分,到底这个根结点,是访问完了左子树还是右子树,所以需要添加一个变量帮助辨认。

void Postorder(BiTree T){Stack S;  //用于记录根和字根结点InitStack(S);//初始化栈BiNode *p=T;//临时变量记录记录当前访问的结点BiNode *r = NULL; //临时变量,记录上一个访问到的结点,因为从右边访问根结点必定是右子树已经遍历完了,此时上一个访问的结点必定是右子树的根结点while(p||!IsEmpty(S){if (p!=NULL){push(S,p);p = p->lchild;}else{GetTop(S,p);//只读取根结点,不对栈内结点进行操作//没有对右子树进行操作过if(p->rchild!=NULL&&p->rchild!=r){p=p->rchild;push(S,p);p=p->lchild;}else{pop(S,p);visit(p);//对p进行访问,可以进行打印等操作r=p;//记录当前访问的是p结点p==NULL;//把p置空,进入下一次循环,直到栈内无元素,且p为空时遍历完成}//else}//else}//while
}

代码讲解:https://www.bilibili.com/video/BV1it4y1X7xd/

二叉树非递归后序遍历算法(C语言)相关推荐

  1. 二叉树非递归后序遍历算法的一种简单思路

    首先从简单的例子开始 1 2 3 上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123" 有什么发现? ...

  2. 二叉树非递归后序遍历算法

    与正常的非递归中序遍历算法不同于两点: 一  比正常的中序遍历算法多了对数据元素的标记. 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲通 ...

  3. 二叉树非递归后序遍历

    /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig ...

  4. 二叉树非递归后序遍历的三种办法

    方法一: 双栈,利用生成先序序列思路,左--右依次入栈再出栈,得到头--右--左的序列,再将该序列入另一栈再出栈,得到左--右--头序列: void PostOrder_1(Bitree *T) {T ...

  5. 非递归后序遍历二叉树总结(2种方法)

    算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历 ...

  6. 二叉树路径应用举例(基于非递归后序遍历)

    #include "stdafx.h" #include <iostream> #include <fstream>using namespace std; ...

  7. 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)

    一,前言 本文是原创作品,可能存在不足,欢迎大家指正,礼貌交流,感激不尽. 二,思路 二叉树后序遍历不同于前序遍历和中序遍历,后序遍历是三者之间最难的.下面就让我们来梳理一下代码的逻辑,看看如何轻松地 ...

  8. 二叉树非递归先序遍历

    二叉树的递归先序遍历很简单,假设二叉树的结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 ...

  9. 二叉树非递归后序(后根)遍历

    1.要求 使用非递归方式对二叉树进行(后序)后根遍历. 2.思路 使用先序(先根)遍历,然后将遍历的结果反过来.但要注意:无论是先根遍历还是后根遍历,左子树的遍历始终在右子树之前,所以要使先根遍历结果 ...

最新文章

  1. linux数据库什么意思,Linux系统中的数据库命令是什么
  2. java 7 学习笔记_Java学习笔记7-网络编程
  3. DiffServ实现技术
  4. Linux内核裁剪及编译
  5. 数据挖掘领域十大经典算法初探
  6. WIN32下(非MFC)自编TRACE
  7. 酸吗?28岁程序员财务自由宣布退休!
  8. CodeForces 444C 节点更新求变化值的和
  9. 工作日志20150202
  10. Python 实现进程间通信(网络编程)
  11. 外网资源下载速度过慢的问题
  12. 深入理解操作系统原理之Windows进程管理
  13. linux下的MBR(msdos)分区与格式化----fdisk mkfs
  14. 浮点数float累加误差解决方式总结
  15. java 主机字节序_java字节序、主机字节序和网络字节序扫盲贴
  16. LeetCode——223. 矩形面积(Rectangle Area)[中等]——分析及代码(C++)
  17. 代码规范+《数学之美》读后感
  18. VisionMaster的脚本模块调试
  19. 环境和社会风险分类c类_六大环境风险分类
  20. 电子元器件的包装方式

热门文章

  1. 一番街的奇迹(很好看)
  2. 2022-2023山东大学软件工程考试及复习建议
  3. 系统流程图、数据流图、状态转换图、盒图的区别(软件工程课程中学到的)
  4. 【PR】关于字幕的一系列设置
  5. 【线性代数】3-2:零空间(Nullspace)
  6. 回梦游仙-仙剑奇侠传4主题曲:再一次感动仙剑
  7. 《儿女英雄传》不符合国情的地方
  8. Axure案例教程——同步选择和删除标签
  9. 2010年最值得推荐的十大开源b2b行业门户网站管理系统
  10. JavaSE个人复习式整理知识点之异常、线程