【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

这篇具有很好参考价值的文章主要介绍了【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

0.二叉树的链式结构实现

先来看看BuyNode():

1.前序遍历:

1.1前序遍历代码实现

1.2深度优先搜索

2.中序遍历:

2.1中序遍历代码实现

3.后序遍历: 

3.1后序遍历代码实现

4.前中后遍历的差别及互相转换

4.1前中推树的结构

4.2中后推树的结构

4.3前后推树的结构

完结撒花:


【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

 

0.二叉树的链式结构实现

上文提到过,在简单二叉树当中,我们一般采用双指针链式结构存储的方式,其结构长这样

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

其结构体中包含三个值 left,right,val三个值

struct tree{
    int val;
    tree* left;
    tree* right;
}; 

 为了方便之后遍历的调试,我们先初始化下这颗二叉树

先来看看BuyNode():

与之前链表的Node类似,所以就不细讲了(给定一个值,malloc其节点,将值存入x,其左右指针置空,返回这个节点值)

tree* BuyNode(TDataType x)
{
	tree* tmp = (tree*)malloc(sizeof(tree));
	tmp->x = x;
	tmp->left = NULL;
	tmp->right = NULL;
	return tmp;
}

之后将每个节点连接起来.

tree* CreateTree()
{
	tree* node1 = BuyNode(1);
	tree* node2 = BuyNode(2);
	tree* node3 = BuyNode(3);
	tree* node4 = BuyNode(4);
	tree* node5 = BuyNode(5);
	tree* node6 = BuyNode(6);
	tree* node7 = BuyNode(7);
	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	return node1;
}

 连接图就长这样.【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

 初始化完二叉树,就开始进入正题吧!

1.前序遍历:

树是一个递归的过程,所以进行遍历的时候,往往采用递归的方法比较简单(代码上),思维上当你理解了递归,也会发现就不过如此.

我们先来了解下前序遍历的含义:前序遍历顾名思义就是从根开始遍历,其遍历顺序为 先访问根再访问其左节点,之后才是右节点,对于每一颗子树都是如此.

例如这幅图,其先遍历根(1) 在遍历其左子树

进入左子树时,先访问其根(2) 在遍历其左子树

进入左子树时,先访问其根(3) 在遍历其左子树  发现为空!再遍历右子树,发现也为空,则返回到上一层(2)

此时再遍历根为(2)的右子树 发现为空,则返回到上一层(1)

此时在遍历其右子树

先访问其根(4)在遍历其左子树

进入左子树时,先访问其根(5) 在遍历其左子树  发现为空!再遍历右子树,发现也为空,则返回到上一层(4)

此时再访问根为(4)的右子树 其根为(6) 左右子树都为空则返回.

返回到根为1的节点就结束了

直接看文字似乎十分的绕,下面可以看看这幅图【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

 所以前序遍历结果为:1 2 3 4 5 6,第一个为该树的根

1.1前序遍历代码实现

void Preorder(tree* tr)
{
	if (tr == NULL)
	{
		printf("NULL  ");
		return;
	}
	printf("%d  ", tr->x);
	Preorder(tr->left);
	Preorder(tr->right);
}

这是模板,遇到节点直接打印,空的话就返回到上一层当中.虽然这代码十分的简短,但第一次遇到的时候,其背后的思考量还是很大的.

以下为递归展开图,推荐自己动手画一下.

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

1.2深度优先搜索

这与深度优先搜索十分的相似

2.中序遍历:

中序遍历相较于前序改变的只是遍历根的顺序,前序为:根左右 根在前

所以中序遍历为:左根右 先遍历完左子树,在访问 其根节点,再遍历其右子树 

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

其遍历完的结果为:321546 

其遍历顺序是这样的. 可以看出他会先走到最左边的节点 访问(因为没有左右节点了),之后访问此左节点的根节点,之后是右节点

又因为这个根节点又有其父节点,所以以此类推.

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

2.1中序遍历代码实现

void Inorder(tree* tr)
{
	if (tr == NULL)
	{
		printf("NULL  ");
		return;
	}
	Inorder(tr->left);
	printf("%d  ", tr->x);
	Inorder(tr->right);
}

3.后序遍历: 

 依旧如之前所说,改变的只是访问根的时机,所以后序遍历的方式为:左右根

也就是先访问左节点 再访问右节点,最后才访问根节点

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

按照这个顺序遍历下来,其结果为:325641 可以看到根在最后 

3.1后序遍历代码实现

void Postorder(tree* tr)
{
	if (tr == NULL)
	{
		printf("NULL  ");
		return;
	}
	Postorder(tr->left);
	Postorder(tr->right);
	printf("%d  ", tr->x);
	
}

4.前中后遍历的差别及互相转换

前序遍历 根在前

中序遍历 根在中间

后序遍历 根在最后 

我们可以通过根据任意前/后+中序遍历的结果,推导出这棵树的结构

4.1前中推树的结构

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

 刚刚提到 前序遍历的根在第一个,而中序遍历的根在中间,

找到其所在位置,理出其左右子树

所以这颗二叉树应该是长这样的

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

之后再依据刚刚的规律,通过前序的结果 发现47当中 7是根 9621当中 9是根

 【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

 又通过中序的结果发现6是9的左子树的根  12是9的右子树 通过前序看出 2是根 1是左子树

所以这颗树就被画出来了

 【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

可以发现 找根用前序遍历,找左右子树用中序遍历的结果 

4.2中后推树的结构

中序结果为:4756912 后序结果为 4761295

依然先通过后续遍历的最后一个结果确定整棵树的根为5 然后依据中序的结果 分出左右子树

为 47 5  6912

之后再次通过刚刚的方法 与前序遍历大同小异 这里就不赘述了.

找根用后序遍历,找左右子树用中序遍历的结果 

4.3前后推树的结构

这样是推不出来的 ,当这颗树只有两个节点的时候,无法分辨其为左子树还是右子树

【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

也可以得出:若前序后序刚好相反 ,其只有一个叶子节点

完结撒花:

🌈本篇博客的内容【前中后层序遍历 --二叉树的结构特点与遍历方式】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!文章来源地址https://www.toymoban.com/news/detail-405806.html

到了这里,关于【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 前序遍历的遍历方式是 先根节点 在左节点 在右节点 述这棵树前序遍历的结果是: A B D E C F G 递归的思想就是把问题拆分成一个个小问题来解决 treeNode是一个内部类 具体实现

    2023年04月26日
    浏览(52)
  • 【二叉树初阶】前中后序遍历+层序遍历+基础习题

    本篇文章将用大白话以及图解讲解二叉树初阶的遍历和相关习题,初学二叉树的小白一看就会。 普通二叉树的增删查改是没有价值的,用它存数据太麻烦,不如用顺序表、链表、至多是完全二叉树存储,所以我们只关注遍历过程,因为学习二叉树最简单的方式就是遍历,也为

    2024年02月02日
    浏览(45)
  • 14-数据结构-二叉树的创建以及前中后遍历,以及结点和叶子节点的计算(C语言)

    概述:         二叉树,这里采用孩子链表存储法,即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候,先创建各个二叉树结点(这里的结点采用动态分配,因此结点为指针变量),随后,再根据逻辑结构图,手动通过左右指针域,链接到对

    2024年02月11日
    浏览(45)
  • 二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    各位CSDN的uu们你们好呀,今天小雅兰的内容仍然是二叉树和Leetcode每日一题,下面,就让我们进入二叉树的世界吧!!! 这个题目需要重新定义一个函数,函数参数需要有左子树和右子树,题目所给定的函数无法解决问题。 每个不为空的结点,都可以认为是一棵子树的根 

    2024年02月16日
    浏览(46)
  • 【二叉树】1-5,理论基础、前中后序遍历的递归法和迭代法、层序遍历

    除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。 一个深度为k的有n个节点的二叉树,对树中的节点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全

    2024年02月13日
    浏览(34)
  • 数据结构——二叉树的先中后序遍历

    ——本节内容为Bilibili王道考研《数据结构》P43~P45视频内容笔记。 目录 一、二叉树的先中后序遍历 1.先中后序遍历 2.举例  3.先中后序遍历和前中后缀的关系 4.代码实现 5.求遍历序列 6.应用:求树的深度 二、二叉树的层次遍历 1.层次遍历 2.算法思想: 3.算法演示: 4.代码实

    2024年02月12日
    浏览(39)
  • 数据结构——二叉树层序遍历

    来喽来喽~ 二叉树的层序遍历来喽~ 层序遍历那是相当有趣滴! 我的朋友,请不要迷惘,你要记住,你终有鲲鹏一日! 加油吧!从现在开始~ 层序遍历 :除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所

    2024年02月07日
    浏览(46)
  • 力扣、【前中后序遍历】

    终止条件:当前节点为空节点,即为终止。 返回值:无返回值,因为当前节点为空节点,所以上一层的节点为叶子节点,然后将其记录下来。 每级操作:对于当前节点,我们需要去查询当前节点的左右子树。 换一下就行; 同上:

    2024年02月12日
    浏览(38)
  • 【数据结构】二叉树的层序遍历

    当我们面对一个树结构时,常常需要对其进行遍历以获取其中的节点信息。其中一种常用的遍历方式是层序遍历,也称为广度优先搜索(BFS)。本篇博客将详细介绍层序遍历的原理和实现方法。 层序遍历以树的根节点开始,按照从上到下、从左到右的顺序逐层遍历树中的节点

    2024年02月03日
    浏览(46)
  • 【数据结构】二叉树的层序遍历(四)

     目录 一,层序遍历概念 二,层序遍历的实现         1,层序遍历的实现思路         2,创建队列         Queue.h         Queue.c         3,创建二叉树         BTree.h         BTree.c         4,层序遍历的实现 层序遍历:除了先序遍历、中序遍历、

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包