二叉树的遍历(非递归)
由于二叉树的递归方法实际上是系统在使用栈进行操作,因此我们的迭代(非递归)方法也就需要使用栈进行模拟。
一、先序遍历
我们需要明白,进栈的元素都是树的根节点 root。
所以我们需要先访问该节点,再将该节点进栈。
【数据结构】树的非递归先序遍历、中序遍历算法_哔哩哔哩_bilibili二叉树的非递归后序遍历算法https://www.bilibili.com/video/BV1gV411U7XJ?from=search&seid=5899376191017226924&spm_id_from=333.337.0.0
感觉这个讲的很不错,其中使用了一个口诀:
1.无脑进栈
2.遇到NULL访问栈顶(也就是再找不到更小的左儿子了)
3.访问栈顶右孩子
只要是碰到新的结点(也就是新的root)那么就无脑进栈。
我们在编程的时候,先将结点输出,然后再进栈,也就是说,只要我们进栈的顺序就是我们的先序的数列顺序,那就实现了先序遍历。
最大的结束循环的条件就是:不仅仅它的左右儿子都是NULL了,而且栈里面是空的了(也就相当于将所有的结点都遍历了一遍)。
注意细节:root = s[top--]; //在访问某个结点D的右孩子的同时,也删掉了该结点D
//先序遍历
void PreOrder()
{s[NUM]; //构造的栈是为了存储左儿子的,因为右儿子不用存top = -1;while(root != NULL || top != -1) //先序(中左右):当到右侧的时候,就不需要保存右侧结点{while(root != NULL){//一直向左侧找儿子,找到最小的左儿子printf("%d", root->data); //由于是先序,所以先输出根s[++top] = root;root = root->lchild;}if(top != -1){//找到右侧的兄弟root = s[top--]; //在访问某个结点D的右孩子的同时,也删掉了该结点Droot = root->rchild;}}
}
二、中序遍历
与先序遍历的大体都相同,唯一不同的点是:访问的时间不同(先序是在进栈的时候访问该节点,中序是在出栈的时候访问该节点)
出栈时候访问结点即可实现左中右顺序的原因:
由于我们循环无脑进栈(未碰到 root != NULL时)的最后一个一定是最左的儿子D,我们先让他出栈,然后我们在访问D的父结点以求得到D的兄弟时,也要将D的父亲结点出栈——这就是左中右的中,理所当然,当我们最后pop的结点时,就剩下右节点去pop了。
三、后序遍历
二叉树的遍历(非递归)相关推荐
- 二叉树后续遍历非递归
二叉树的后序非递归遍历就比较难写,因为涉及到判断节点的访问状态- 现在有个很巧妙的方法: 前序:根->左->右 后序:左->右->根 那么可以把后序当作:根->右-> ...
- 对于二叉树三种非递归遍历方式的理解
利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...
- 二叉树的遍历 (递归和非递归实现)
二叉树的遍历 (递归实现) 用C++实现二叉树的"先根遍历"存储. 用C++实现二叉树的"先根遍历"."中根遍历"."后根遍历&q ...
- 二叉树的遍历(递归,非递归,Morris)
二叉树的遍历 目录 递归遍历 非递归遍历 Morris遍历 1. 递归遍历 递归版遍历只要当前节点不为null,就可以三次回到当前节点. public static void preOrderRecu ...
- 数据结构(六)二叉树的遍历(递归非递归方法)
数据结构(六)二叉树的遍历(递归非递归方法) 一.递归方法 1.先序遍历 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrde ...
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...
- 二叉树后序遍历_二叉树后序遍历非递归实现
二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...
- 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法
引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...
- 二叉树的遍历(递归与非递归实现)
二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...
- 二叉树的前序非递归遍历
二叉树的前序非递归遍历 前面学习过二叉树的前序遍历,使用递归的方式.简单回顾一下: Status PerOrder(BiTree T) {//前序遍历二叉树if (T != NULL) {Visit( ...
最新文章
- 操作系统性能优化分析及工具
- 性能测试回归测试_自动网站性能回归测试
- php 小炒花生,炒花生的做法_炒花生怎么做_炒花生的家常做法
- C# Winform继承窗体打开设计器白屏的一例解决方法
- Python闭包与延迟绑定
- Android:sqlite问题小结
- 前端学习(2552):vue简介
- CSS强制按比例缩小图片
- C++学习之路 | PTA乙级—— 1052 卖个萌 (20 分)(精简)
- 阵列卡正确安装调试方法
- 他是BAT 100万+年薪大数据专家,今天你可以免费学习他的内部课程,仅限100人...
- three.js 05-04 之 BoxGeometry 几何体
- 大猫谈JNCIE实验考试备战
- java进阶--深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)
- 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
- Python - 统计某一列不同项的重复次数 并新增一列赋值
- 让JAVA 中Swing界面更加美观
- Abaqus 利用FindAt函数根据坐标查找点,线,面
- 5 大最常用 C++ 经典算法
- 关于Freesurfer提取annotation分区结构特征的命令mri_segstats
热门文章
- Fine-Grained Visual Classification via Progressive Multi-Granularity Training of Jigsaw Patches
- 【攻防世界 level2】
- ibm3630m4服务器装系统,ibm x3630m4安装Windows2008R2系统
- 玩客云刷入Linux系统,搭建FTP服务器
- java 字符 加密_Java 字符串的加密与解密
- 平狄克微观经济学笔记和课后习题答案
- 家里宽带使用有线连接网速很快但是使用无线连接网速很慢的解决方法
- 【DSA_Fall2020】2. Trees (Templates in C)
- nn.BCELoss和nn.CrossEntropyloss
- 微信小程序图片放大预览效果的实现,轮播图点击放大预览