数据结构专题 | 先序非递归遍历二叉树
先序非递归遍历二叉树,主要是利用了栈的先进后出原理,用一个栈即可实现该算法,下面我们一起来看一下如何来实现吧
目录
先序建立二叉树
先序递归遍历二叉树
先序非递归遍历二叉树
先序建立二叉树
在进行先序非递归遍历之前,我们需要先建立一个二叉树,这里采用先序的方法建立二叉树
void Create(BiTree *t){
BiTree q; //树结点
char s; //输入的值
scanf("%c",&s);
getchar();
if(s=='#'){ //当建立时某个树没有左孩子或右孩子时,我们输入一个#
*t=NULL;
return;
}
q=(BiTree)malloc(sizeof(BiTree)); //分配内存
q->data=s;
*t=q; //根结点
Create(&q->lchild); //先序建立左子树
Create(&q->rchild); //先序建立右子树
}
先序递归遍历二叉树
在建立完二叉树后,我们先来看看递归的算法是如何实现的
void xianxu(BiTree t){
if(!t) return; //当树节点为空时,返回
printf("%c",t->data); //打印跟结点
xianxu(t->lchild); //先序遍历左子树
xianxu(t->rchild); //先序遍历右子树
}
先序非递归遍历二叉树
下面我们来看看如何非递归对二叉树进行遍历
void fxianxu(BiTree t){
BiTree stack[100],p; //我们需要一个保存树结点的栈
int top=0; //栈顶指针
for(int i=0;i<100;i++){
stack[i]=0; //初始化栈
}
p=t; //根结点
while(p){
printf("%c",p->data); //打印根结点
if(p->rchild){ //先从右边开始,如果右子树不为空
stack[top++]=p->rchild; //右子树入栈
}
if(p->lchild){ //再看左子树,如果左子树非空
p=p->lchild; //继续遍历下一个左子树
}else if(top>0){ //如果左子树为空但是栈不为空
p=stack[--top]; //此时栈顶是当前树的右子树,将右子树出栈
}else{ //当左子树为空,且栈中没有元素时,遍历结束
p=0;
}
}
}
以上代码理解起来有点抽象,我们举个例子来说明一下:
假设现在我们输入了AB##C##,这是棵最简单的二叉树,A是根结点,B是A的左子树,C是A的右子树,我们用非递归方法对其进行遍历,先看A的右子树,发现它有右子树,右子树是C,C入栈,再看A的左子树,发现它有左子树,左子树为B,我们令B为新的树结点,第一次循环结束,开始第二次循环,我们先看右子树,发现B没有右子树,不做任何操作,再看B的左子树,发现B也没有左子树,但是当前栈中有元素C,我们出栈,并令C为新的树结点,第二次循环结束,执行第三次循环,我们还是先看C的右子树,发现C没有右子树,不做任何操作,再看C的左子树,发现左子树为空,并且当前栈中没有元素,我们令新的树结点为空,即可跳出循环
我们最后来总结一下如何对二叉树进行先序非递归的遍历:
第一步,打印根结点
第二步,先看树结点的右子树,存在,入栈
第三步,再看树结点的左子树,存在,令其为新的树结点,不存在看该树结点右子树是否存在(就是看栈中是否有元素),存在右子树就让右子树为新的树结点继续循环,当某个树结点既没有左子树也没有右子树时结束循环
数据结构专题 | 先序非递归遍历二叉树相关推荐
- 数据结构: 中序非递归遍历二叉树
status InOrderTraverse(BiTree T,status (*visit)(TElementType e) { InitStack(s); p=T; while(p||!Stack ...
- 中序非递归遍历二叉树
二叉树的递归算法虽然简单,但是会导致时间复杂度比较高,下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树,和元素类型为二叉树的栈 typedef struct BiTNode{TElemTyp ...
- 后序非递归遍历二叉树
后序遍历的顺序是左.右.根.而前序遍历的顺序是根.左.右.所以只需将前序遍历稍作改变,变成先遍历根再遍历右最后遍历左即(根右左)就会发现此时的顺序便是后序遍历的倒序了,所以这时候只需将改变后的前序遍历 ...
- 后序非递归遍历二叉树的应用
1.打印值为x的结点的所有祖先 栈从0开始,top初始值-1 #include "stdafx.h" #include<iostream> using namespac ...
- 二叉树的中序非递归遍历
二叉树的中序非递归遍历 中序遍历的非递归算法描述如下: 从根节点开始检索,如果当前节点不为空,则将当前节点入栈,让当前节点成为其左孩子节点,再继续上一步的操作 加入当前节点为空了,说明其父节点已经没有 ...
- C++实现递归,非递归遍历二叉树(前序,中序,后序)
初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...
- 二叉树中序非递归遍历
递归是程序设计中强有力的工具.递归函数结构清晰,使程序易读.但递归函数也有不可克服的弱点,时间.空间效率较低,运行代价较高,所以在实际使用中,常希望使用它的迭代版本.为了实现非递归遍历算法,需要一个堆 ...
- 数据结构_非递归遍历二叉树(C语言)
数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...
- 二叉树的后序非递归遍历(巧妙思想)
大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...
最新文章
- 微软可能是全球最大的开源贡献者,但开发者似乎并不买账​​​​​​​
- matlab建模实例运筹学,matlab数学建模实例与编程教程
- Android 导航栏如何轻松搞定
- vue.js实战——购物车练习(包含全选功能)
- python zipfile 乱码_python zipfile文件名乱码问题
- ubuntu下pip的安装、升级和使用
- python标准库学习5 ---bisect — Array bisection algorithm
- python 日志框架_按日期打印Python的Tornado框架中的日志的方法
- VB6 如何添加自定义函数 模块 把代码放到一个模块中
- 使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
- 三角函数π/2转化_数学集训营 | NO.16 任意角的三角函数之必考点
- python绘制国际象棋规则口诀_国际象棋口诀
- python实现税后工资_Python扣除个人税后的工资计算器
- .NET发邮件(验证码)
- 全球裁员潮,Salesforce职业能否抵御风险?
- ​UG塑胶模具设计结构分析是如何挤压成型的
- 【高质量编程指南笔记】
- 软件使用小技巧-Linux疑难杂症
- S60v5 GBA模拟器gpSP4Symbian v0.5安装使用图文教程
- MATLAB定义大气湍流模型退化函数,基于改进的Kolmogorov谱湍流模型的图像退化研究...
热门文章
- 机器学习(概述一)——定义
- sklearn聚类之谱聚类SpectralClustering
- Qt--编译安装QWT
- javascript学习路线图
- mint ui tabbar选中后怎么改变icon图标_微信朋友圈怎么转发 微信里面的朋友圈发的怎样再转发一次?...
- C24、异常处理程序和软件异常
- Autodesk 3ds Max 2013 下载 破解 教程
- C#配合zxing的二维码生成器
- Java爬虫框架WebMagic
- [附源码]Python计算机毕业设计Sketch2Mod网站Django(程序+LW)