数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)

简介: 数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)

设想一下二叉树要用什么样的方式来存储,一种是用数组,一种是用链表。

顺序存储结构

用数组,也就是用顺序存储结构,比较合适的就是用于完全二叉树:


按从上至下,从左到右顺序存储n个节点的完全二叉树。 其中的节点父子关系会满足:

  • 非根节点(序号 > 1)的父节点的序号是[i / 2]
  • 节点(序号为i)的左孩子节点的序号是[2i],(若2i <= n,否则没有左孩子)
  • 节点(序号为i)的右孩子节点的序号是[2i+1],(若2i+1 <= n,否则没有右孩子)

一般的二叉树也可以采用这种结构,但是会造成空间浪费。

这样简单的一个二叉树要浪费两个空间,再复杂一些的二叉树浪费的空间就会多得多了。 总结:用数组来表示是可行的,但如果一般的二叉树跟对应的完全二叉树相比,缺的节点很多的话,会造成一定的空间浪费。

链表存储结构

链表存储就是用之前的儿子-兄弟表示法,定义两个指针域就可以表示二叉树了。

typedef int ElementType;
typedef struct TreeNode
{
  ElementType data;
  struct TreeNode* Left;
  struct TreeNode* Right;
}TreeNode;

二叉树的递归遍历

先序递归遍历

遍历过程为:

  1. 访问根节点
  2. 先序遍历其左子树
  3. 先序遍历其右子树

先序遍历的序列为:A B D F E C G H I

中序递归遍历

遍历过程为:

  1. 中序遍历其左子树
  2. 访问根节点
  3. 中序遍历其右子树

可以脑子里过一遍,下面再公布正确的中序遍历的序列。

中序遍历的序列为:D B E F A G H C I

后序递归遍历

遍历过程为:

  1. 后序遍历其左子树
  2. 后序遍历其右子树
  3. 访问根节点

同样先自己写出后序遍历的序列,对照后面的正确序列。

后序遍历的序列为:D E F B H G I C A

在先序、中序和后序的遍历过程中,它们经过节点的路线其实是一样的(路线会在之后的非递归遍历中提到)

都是按这个顺序,只是访问各节点的时机不同。

下面就看看各方式遍历下,访问节点的时机分别是怎样的。

首先要清楚,沿着路线,对每个节点都会访问三次:

所谓先序、中序和后序,就是说:先序是在第一次经过节点时就将节点访问、中序是在第二次经过节点时将节点访问、而后序就是在第三次经过节点时将节点访问。

故有了:

先序遍历路线图

 

中序遍历路线图

后序遍历路线图


end



目录
相关文章
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
249 4
|
10月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
11月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
429 30
|
11月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
581 25
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
578 5
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
583 3
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
420 5
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
732 0