前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c++二叉树的先序,中序,后序遍历_二叉树的构造

c++二叉树的先序,中序,后序遍历_二叉树的构造

作者头像
全栈程序员站长
发布于 2022-11-04 07:44:47
发布于 2022-11-04 07:44:47
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

数据结构——二叉树先序、中序、后序三种遍历

一、图示展示:

(1)先序遍历

先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果

先序遍历结果为:A B D H I E J C F K G

动画演示:

记住小人沿着外围跑一圈(直到跑回根节点),多看几次动图便能理解

(2)中序遍历

中序遍历可以看成,二叉树每个节点,垂直方向投影下来(可以理解为每个节点从最左边开始垂直掉到地上),然后从左往右数,得出的结果便是中序遍历的结果

中遍历结果为:H D I B E J A F K C G

动画展示:

记住,中序遍历就是从最左边开始,把每个节点垂直投影到同一直线上,然后从左往右读值就可以了,多看几遍动图就理解了

(3)后序遍历

后序遍历就像是剪葡萄,我们要把一串葡萄剪成一颗一颗的。

还记得我上面提到先序遍历绕圈的路线么?(不记得翻上面理解)

就是围着树的外围绕一圈,如果发现一剪刀就能剪下的葡萄(必须是一颗葡萄)(也就是葡萄要一个一个掉下来,不能一口气掉超过1个这样),就把它剪下来,组成的就是后序遍历了。

后序遍历中,根节点默认最后面

后序遍历结果:H I D J E B K F G C A

动画展示:

(4)层次遍历

层次遍历很好理解,就是从根节点开始,一层一层,从上到下,每层从左到右,依次写值就可以了

层次遍历结果:A B C D E F G H I J K

解释外圈跑的意思:

绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。

(5)口诀

先序遍历: 先根 再左 再右

中序遍历: 先左 再根 再右

后序遍历: 先左 再右 再根

这里的根,指的是每个分叉子树(左右子树的根节点)根节点,并不只是最开始头顶的根节点,需要灵活思考理解,建议画图理解!!

二、代码展示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree{ 

int data;					// 存放数据域
struct Tree *lchild;			// 遍历左子树指针
struct Tree *rchild;			// 遍历右子树指针
}Tree,*BitTree;
BitTree CreateLink()
{ 

int data;
int temp;
BitTree T;
scanf("%d",&data);		// 输入数据
temp=getchar();			// 吸收空格
if(data == -1){ 
			// 输入-1 代表此节点下子树不存数据,也就是不继续递归创建
return NULL;
}else{ 

T = (BitTree)malloc(sizeof(Tree));			// 分配内存空间
T->data = data;								// 把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ",data);		
T->lchild = CreateLink();					// 开始递归创建左子树
printf("请输入%d的右子树: ",data);			
T->rchild = CreateLink();					// 开始到上一级节点的右边递归创建左右子树
return T;							// 返回根节点
}	
}
// 先序遍历
void ShowXianXu(BitTree T)			// 先序遍历二叉树
{ 

if(T==NULL)						// 递归中遇到NULL,返回上一层节点
{ 

return;
}
printf("%d ",T->data);
ShowXianXu(T->lchild);			// 递归遍历左子树
ShowXianXu(T->rchild);			// 递归遍历右子树
}
// 中序遍历
void ShowZhongXu(BitTree T)			// 先序遍历二叉树
{ 

if(T==NULL)						// 递归中遇到NULL,返回上一层节点
{ 

return;
}
ShowZhongXu(T->lchild);			// 递归遍历左子树
printf("%d ",T->data);
ShowZhongXu(T->rchild);			// 递归遍历右子树
}
// 后序遍历
void ShowHouXu(BitTree T)			// 后序遍历二叉树
{ 

if(T==NULL)						// 递归中遇到NULL,返回上一层节点
{ 

return;
}
ShowHouXu(T->lchild);			// 递归遍历左子树
ShowHouXu(T->rchild);			// 递归遍历右子树
printf("%d ",T->data);
}
int main()
{ 

BitTree S;
printf("请输入第一个节点的数据:\n");
S = CreateLink();			// 接受创建二叉树完成的根节点
printf("先序遍历结果: \n");
ShowXianXu(S);				// 先序遍历二叉树
printf("\n中序遍历结果: \n");
ShowZhongXu(S);				// 中序遍历二叉树
printf("\n后序遍历结果: \n");
ShowHouXu(S);				// 后序遍历二叉树
return 0;	
} 	

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月14日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
二叉树的链式存储结构创建与遍历
递归异常,忘记生成树的时候申请空间,和节点异常,定义了数据为%d类型,输入了整个字符串导致
一个风轻云淡
2023/12/30
1600
详解二叉树遍历(C/C++)
中序遍历是指中序遍历根结点的左子树,然后访问根结点,在中序遍历右子树(左子树为空或者已经遍历才能访问根)
莫浅子
2022/11/18
7590
详解二叉树遍历(C/C++)
树——构造遍历二叉树
构造二叉树,遍历二叉树,先序+中序构造二叉树后序遍历,中序+后序构造二叉树先序遍历。
AngelNH
2020/04/16
5910
二叉树的遍历
二叉树的遍历可以说是二叉树最重要的一个内容,如果想对树的算法有一定的认识,那么二叉树的遍历是一定要熟练使用的,本文将主要介绍一下二叉树的遍历。
跋扈洋
2022/12/03
2950
二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
  对于一种数据结构而言,遍历是常见操作。二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树。二叉树的节点声明如下: 1 typedef struct TreeNode *PtrToNode; 2 typedef struct TreeNode *BinTree; 3 4 struct TreeNode 5 { 6 int Data; //为简单起见,不妨假设树节点的元素为int型 7 BinTree Left; 8 BinTree Right; 9 };  
llhthinker
2018/01/24
1.5K0
二叉树的基本操作(C 语言版)包含递归和非递归算法
二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。二叉树通常以结构体的形式定义,如下,结构体内容包括三部分:本节点所存储的值、左孩子节点的指针、右孩子节点的指针。
零式的天空
2022/03/28
3.9K0
4.3.1 二叉树的遍历
所谓二叉树的遍历,是指按照某条搜索路径访问树中的每个结点,使得每个几点均被访问一次,而且仅被访问一次。
week
2018/08/24
5190
实验三 二叉树的基本操作(建立)及遍历
实验三 二叉树的基本操作(建立)及遍历 实验目的 1.学会实现二叉树结点结构和对二叉树的基本操作。 2.通过对二叉树遍历操作的实现,理解二叉树各种操作,学会利用递归方法编写对二叉树等类似递归数据结构进行处理的算法。 实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 实验内容 1.编写程序输入二叉树的结点个数和结点值,构造下图所示的二叉树。 2.编写程序,采用中序遍历的递归和非递归算法对此二叉树进行遍历。
谙忆
2021/01/20
7440
实验三 二叉树的基本操作(建立)及遍历
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
二叉树是树形结构的一种特殊形式,它的每个节点最多有两个子节点,分别称为左子节点和右子节点,对应的子树就是左子树和右子树。二叉树可以为空(即没有节点),也可以由根节点、左子树和右子树组成复杂的树形结构,这种结构在很多数据处理场景中有着重要应用,例如表达式解析、文件系统目录结构模拟、搜索算法实现等。
Rossy Yan
2024/12/27
1570
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
【数据结构】C语言实现二叉树的基本操作——二叉树的遍历(先序遍历、中序遍历、后序遍历)
通过前面的介绍,我们已经认识了二叉树的逻辑结构和存储结构。在今天的内容中,我们将会开始介绍二叉树的最后一个要素——二叉树的基本操作。
蒙奇D索隆
2024/09/07
1K0
【数据结构】C语言实现二叉树的基本操作——二叉树的遍历(先序遍历、中序遍历、后序遍历)
利用二叉链表创建二叉树
学习了二叉树有关的知识之后,我应该如何用python知识,利用二叉链创建一个二叉树呢?
算法与编程之美
2024/01/23
1260
利用二叉链表创建二叉树
二叉树的构建及其遍历算法
本篇博客参照了兰亭风雨的博客:http://blog.csdn.net/ns_code/article/details/12977901/
AI那点小事
2020/04/20
4430
二叉树的构建及其遍历算法
数据结构——树和二叉树
满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。
ruochen
2021/06/29
7260
带你一文看懂二叉树的先(中、后)序遍历以及层次遍历(图解+递归/非递归代码实现)
  先序遍历的核心思想:1.访问根节点;2.访问当前节点的左子树;3.若当前节点无左子树,则访问当前节点的右子树;即考察到一个节点后,即刻输出该节点的值,并继续遍历其左右子树。(根左右)
嵌入式与Linux那些事
2021/05/20
27.4K0
带你一文看懂二叉树的先(中、后)序遍历以及层次遍历(图解+递归/非递归代码实现)
【数据结构】树与二叉树(七):二叉树的遍历(先序、中序、后序及其C语言实现)
  二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是空集,被称为空二叉树,要么由一个根结点和两棵不相交的子树组成,分别称为左子树和右子树。每个结点最多有两个子结点,分别称为左子结点和右子结点。
Qomolangma
2024/07/30
2370
【数据结构】树与二叉树(七):二叉树的遍历(先序、中序、后序及其C语言实现)
线索二叉树 —C语言王道
从根结点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针pre记录上一个被访的结点 ①当 q == p 时,pre为前驱
莫浅子
2022/11/18
7810
线索二叉树 —C语言王道
二叉树
定义:二叉树是有限结点的集合 二叉树有五种形态,有四种表示方法,其中括号表示法是最重要的,下面的链式存储结构也是根据括号表示法来的== 二叉树的性质: 性质1:非空二叉树上的叶子节点数等于双分支节点数加1 性质2:非空二叉树的第i层上最多有2(i-1)个结点 性质3:高度位h的二叉树最多有2(h)-1个结点
废江_小江
2022/09/05
3040
二叉树
我的思念像满二叉树般疯长,每个空指针都指向你的方向——全程动画可视化数据结构算法之二叉树
盛透侧视攻城狮
2025/03/02
870
我的思念像满二叉树般疯长,每个空指针都指向你的方向——全程动画可视化数据结构算法之二叉树
非递归遍历树
先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来。最后为NULL,开始回溯,返回到前一结点(也就是当前结点的根节点),开始遍历右子树。依次类推。
AngelNH
2020/04/16
8970
代码实现二叉树的三种遍历_遍历二叉树口诀
先序遍历可以想象成,小仙儿从树根开始绕着整棵树的外围转一圈,经过结点的顺序就是先序遍历的顺序 先序遍历结果:ABDHIEJCFKG
全栈程序员站长
2022/09/23
2460
代码实现二叉树的三种遍历_遍历二叉树口诀
推荐阅读
相关推荐
二叉树的链式存储结构创建与遍历
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验