二叉树非递归后序遍历算法(C语言)
二叉树非递归后序遍历算法(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 2 3 上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123" 有什么发现? ...
- 二叉树非递归后序遍历算法
与正常的非递归中序遍历算法不同于两点: 一 比正常的中序遍历算法多了对数据元素的标记. 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲通 ...
- 二叉树非递归后序遍历
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig ...
- 二叉树非递归后序遍历的三种办法
方法一: 双栈,利用生成先序序列思路,左--右依次入栈再出栈,得到头--右--左的序列,再将该序列入另一栈再出栈,得到左--右--头序列: void PostOrder_1(Bitree *T) {T ...
- 非递归后序遍历二叉树总结(2种方法)
算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历 ...
- 二叉树路径应用举例(基于非递归后序遍历)
#include "stdafx.h" #include <iostream> #include <fstream>using namespace std; ...
- 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)
一,前言 本文是原创作品,可能存在不足,欢迎大家指正,礼貌交流,感激不尽. 二,思路 二叉树后序遍历不同于前序遍历和中序遍历,后序遍历是三者之间最难的.下面就让我们来梳理一下代码的逻辑,看看如何轻松地 ...
- 二叉树非递归先序遍历
二叉树的递归先序遍历很简单,假设二叉树的结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 ...
- 二叉树非递归后序(后根)遍历
1.要求 使用非递归方式对二叉树进行(后序)后根遍历. 2.思路 使用先序(先根)遍历,然后将遍历的结果反过来.但要注意:无论是先根遍历还是后根遍历,左子树的遍历始终在右子树之前,所以要使先根遍历结果 ...
最新文章
- linux数据库什么意思,Linux系统中的数据库命令是什么
- java 7 学习笔记_Java学习笔记7-网络编程
- DiffServ实现技术
- Linux内核裁剪及编译
- 数据挖掘领域十大经典算法初探
- WIN32下(非MFC)自编TRACE
- 酸吗?28岁程序员财务自由宣布退休!
- CodeForces 444C 节点更新求变化值的和
- 工作日志20150202
- Python 实现进程间通信(网络编程)
- 外网资源下载速度过慢的问题
- 深入理解操作系统原理之Windows进程管理
- linux下的MBR(msdos)分区与格式化----fdisk mkfs
- 浮点数float累加误差解决方式总结
- java 主机字节序_java字节序、主机字节序和网络字节序扫盲贴
- LeetCode——223. 矩形面积(Rectangle Area)[中等]——分析及代码(C++)
- 代码规范+《数学之美》读后感
- VisionMaster的脚本模块调试
- 环境和社会风险分类c类_六大环境风险分类
- 电子元器件的包装方式