二叉树基础总结

目录

树的定义:

深度和高度:

二叉树

由来

二叉树种类:

满二叉树:

完全二叉树:

严格二叉树(Strict Binary Tree):

平衡二叉树(Balanced Binary Tree):

存储结构(顺序存储和链式存储)

顺序存储

优点:

缺点:

链式存储

链式存储结构的主要特点包括:

二叉树的遍历

前序遍历

代码实现(递归):

中序遍历

代码实现(递归):

后序遍历

代码实现(递归):

层序遍历有点复杂,下一篇专门写这方面的总结。


树的定义:

树(层级结构)是一种重要的非线性数据结构(递归的数据结构),它由n(n≥0)个有限节点组成一个具有层次关系的集合。这些节点具有如下特性:(在一个有效的树中,如果有n个节点,就会有n-1条边。)

  1. 每个节点有零个或多个子节点。
  2. 没有父节点的节点称为根节点。根:树的最顶部的节点,唯一没有双亲的节点。
  3. 每一个非根节点有且只有一个父节点。
  4. 除了根节点外,每个子节点可以分为多个不相交的子树。

树的术语包括:

  1. 结点:使用树结构存储的每一个数据元素都被称为“结点”。
  2. 森林:多棵互不相交的树的集合称为森林。
  3. 有序树和无序树:如果树中结点的子树从左到右看有规定的顺序,这棵树称为有序树;反之称为无序树。

树的最常见实现方式:就是动态创建节点,用指针或者引用把他们链接起来。

如下图:

链接是有方向的,它不是双向而是单向的。当我们遍历一棵树的时候,只能从一个方向进行。

深度和高度:

树的深度(Depth):从根节点开始自顶向下逐层累加,直到最远的叶节点。换句话说,最深的叶结点的深度就是树的深度。如果有多个叶节点位于同一最大深度,那么树的深度就是这个最大深度。因此,树的深度等于树中节点的最大层次。同一深度的节点可以被称为同一级的节点。

树的高度(Height):从树的底层叶节点开始自底向上逐层累加,直到根节点。也就是说,树的高度就是从根节点到最远叶节点的最长路径长度。对于任何树,树的高度等于树的最大层数。

值得注意的是,有些教材或资料在定义树的高度时,可能会将其定义为根节点的高度,即从根节点到最远叶节点的最长路径长度减一。这种定义方式在实际应用中也较为常见。

二叉树

由来

树还有不同的类型,例如二叉树。二叉树是树型结构的一个重要类型,它的每个节点的度(即子节点的数量)不大于2。这意味着二叉树的每个节点最多有两个子节点,通常被称为左子节点和右子节点。

二叉树种类:

满二叉树

是一种特殊的二叉树,其特点是除最后一层外,每一层上的所有节点都有两个子节点。也就是说,如果一个二叉树的深度为K,且结点总数是(2^k) -1,则它就是满二叉树。满二叉树的每一层都包含最大数量的节点,因此在给定深度下,满二叉树具有最多的节点。满二叉树是完全二叉树的特例,完全二叉树是指除最后一层外,其他层的节点数达到最大,且最后一层的节点都集中在左边。在满二叉树中,因为每一层都已经满了,所以它也是一棵完全二叉树。

完全二叉树

是由满二叉树而引出的概念。对于深度为k的有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,这棵二叉树被称为完全二叉树。也就是说,如果对树中的结点按从上至下、从左到右的顺序进行编号,编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树就是完全二叉树。

完全二叉树的特点包括:

  1. 叶子结点只能出现在最下层和次下层。
  2. 最下层的叶子结点集中在树的左部。
  3. 倒数第二层若存在叶子结点,一定在右部连续位置。
  4. 如果结点度为1,则该结点只有左孩子,即没有右子树。
  5. 同样结点数目的二叉树,完全二叉树深度最小。

需要注意的是,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。另外,完全二叉树第i层至多有2^(i-1)个节点,共i层的完全二叉树最多有2^i - 1个节点。

严格二叉树(Strict Binary Tree):

是二叉树的一种特殊类型,它的特点是每个非终端节点(非叶子节点)都有且仅有两个子节点。也就是说,在严格二叉树中,不存在只有一个子节点或没有子节点的非终端节点。严格二叉树与满二叉树和完全二叉树有所不同。满二叉树要求除最后一层外,每一层上的所有节点都有两个子节点,而严格二叉树则只要求非终端节点有两个子节点,对叶子节点没有要求。完全二叉树则要求除最后一层外,其他层的节点数达到最大,且最后一层的节点都集中在左边,而严格二叉树则没有这个要求。

平衡二叉树(Balanced Binary Tree):

是一种特殊的二叉树,其特点是在进行插入、删除等操作后,依然能保持树的平衡性,即任何节点的两个子树的高度差的绝对值不超过1。平衡二叉树有多种实现方式,如AVL树和红黑树等。平衡二叉树的重要性在于它能够保证在最坏情况下,查找、插入和删除操作的时间复杂度都是O(log n),这对于处理大量数据非常有效。如果没有平衡性,最坏情况下二叉树可能退化为链表,导致时间复杂度变为O(n)。

存储结构(顺序存储和链式存储)

顺序存储

二叉树的顺序存储结构通常使用数组来实现。在顺序存储结构中,二叉树中的每个节点按照完全二叉树的顺序存储在一个数组中。完全二叉树的特性使得这种存储方式成为可能,因为在完全二叉树中,除了最后一层之外,其他层的节点数都是满的,并且最后一层的节点都集中在左边。

对于任意一个在数组中的位置为i的节点,其左孩子节点的位置可以通过计算 2i+1 得到,其右孩子节点的位置可以通过计算 2i+2 得到。同样地,对于任意一个位置为j的孩子节点,其父节点的位置可以通过计算 (j-1)/2 得到。

优点:

顺序存储结构的优点是可以快速地访问任意节点,因为每个节点都有一个固定的数组索引。

缺点:

这种存储方式的缺点也很明显,即它可能会浪费存储空间。因为在二叉树中,如果节点数较少,那么数组中的很多位置可能都是空的。此外,对于非完全二叉树,这种存储方式也无法直接表示。

总的来说,顺序存储结构适用于完全二叉树或者节点数较多的二叉树。对于其他类型的二叉树,或者节点数较少的二叉树,链式存储结构可能是一个更好的选择。

链式存储

链式存储结构,又称为链接存储结构,是一种数据的存储方式。

在这种结构中,每个数据元素(通常称为节点)除了包含自身的信息(称为信息域)外,还包含指向其逻辑关系中的下一个节点的指针(称为指针域)。因此,每个节点都通过其指针域与其逻辑关系中的下一个节点相连。这种存储方式不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点。

链式存储结构的主要特点包括:

  1. 存储密度比顺序存储结构小,因为每个节点都需要额外的存储空间来存储指向下一个节点的指针。
  2. 插入和删除操作灵活,节点可以被插入到链表的任何位置,包括首、中、末,而且不需要移动其他节点中的指针。
  3. 链表的大小可以按需伸缩,是一种动态存储结构,因此在增加或删除元素时性能更高。
  4. 查找节点时的效率相对较低,因为只能从第一个节点开始逐个查找,直到找到所需的节点。

总的来说,链式存储结构是一种非常有用的数据结构,特别适用于需要频繁进行插入和删除操作的情况。然而,由于其查找效率相对较低,因此在需要频繁查找的情况下可能不是最佳选择。

二叉树的遍历

二叉树的每个节点都只会被访问一次。

二叉树有一个前驱和两个后继。

二叉树的遍历顺序有4种,分别是:前序遍历,中序遍历,后序遍历和层序遍历。

前序遍历

先访问根节点,再访问左右子树。

运动轨迹如下:

 

代码实现(递归):
void Tree(Tree* root) {if (root == NULL) {return;}printf("%d", root->data);Tree(root->L_ch);Tree(root->R_ch);
}

中序遍历

先访问左子树,再访根节点,最后访问右子树。

运动轨迹如下:

代码实现(递归):
void Tree(Tree* root) {if (root == NULL) {return;}Tree(root->L_ch);printf("%d", root->data);Tree(root->R_ch);
}

后序遍历

先左子树,再右子树,最后根节点。

运动轨迹如下:

代码实现(递归):
void Tree(Tree* root) {if (root == NULL) {return;}Tree(root->L_ch);Tree(root->R_ch);printf("%d", root->data);
}

层序遍历有点复杂,下一篇专门写这方面的总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/469584.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇【第81篇—Pandas数据库】

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇 Pandas是Python中一流的数据处理库,而数据库则是数据存储和管理的核心。将两者结合使用,可以方便地实现数据的导入、导出和分析。本文将深入探讨Pandas中用于与数据库交互的两个关键方…

【ArcGIS Pro二次开发】(79):符号系统_CIMUniqueValueRenderer

CIMUniqueValueRenderer是ArcGIS Pro SDK中的一个类,用于创建唯一值渲染器(Unique Value Renderer)。 在ArcGIS Pro中长这样: 通过对CIMUniqueValueRenderer的操作,可以对符号系统进行更改,实现很多功能。…

【机器学习案例4】为机器学习算法编码分类数据【含源码】

目录 编码分类数据 序数编码 标签编码 一次性编码 目标编码 目标编码的优点 目标编码的缺点 在现实生活中,收集的原始数据很少采用我们可以直接用于机器学习模型的格式,即数值型数据。因此,需要进行一些预处理,以便以正确的格式呈现数据、选择信息丰富的数据或降低其…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒处理流程

网络技术的不断应用与发展,为企业的生产运营提供了有利保障,越来越多的企业走向数字化办公模式,并且企业的发展离不开数据支撑,重视数据安全成为了众多企业关心的主要话题。春节前后,云天数据恢复中心接到很多企业的求…

Python环境下基于最大离散重叠小波变换和支持向量回归的金融时间序列预测

金融时间序列具有非线性、高频性、随机性等特点,其波动情况不仅与当前股票市场、房地产市场、贸易市场等有强联动性,而且大幅度起伏对于其他市场有较大的影响和冲击。由于金融市场受多种因素影响且各影响因素间也存在一定复杂动态交互关系,导…

代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131

文章目录 Day 2501. 组合总和(No. 39)1.1 题目1.2 笔记1.3 代码 02. 组合求和 II(No. 40)2.1 题目2.2 笔记2.3 代码 03. 分割回文串(No. 131)3.1 题目3.2 笔记3.3 代码 Day 25 01. 组合总和(No…

Stable Diffusion主流UI详细介绍

Stable Diffusion目前主流的操作界面有WebUI、ComfyUI以及Fooocus 这里webui和fooocus在人机交互上的逻辑是一样的,fooocus界面更加简洁。 comfyui是在人机交互上是采用流程节点的交互逻辑,和上面略有区别。 界面分别如下: WebUI界面如下 we…

C# winfrom中NPOI操作EXCEL

前言 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。 2.忘了告诉大家npoi是做什么的了,npoi 能够读…

MyBatis篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、MyBatis 实现一对一有几种方式?具体怎么操作的?二、MyBatis 实现一对多有几种方式,怎么操作的?三、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?四、Mybatis 的一级、二级缓存前言 前些天发现了一个巨牛的人工智能…

DS:二叉树的链式结构及实现

创作不易,友友们给个三连吧!! 一、前言 前期我们解释过二叉树的顺序结构(堆)为什么比较适用于完全二叉树,因为如果用数组来实现非完全二叉树,那么数组的中间部分就可能会存在大量的空间浪费。 …

C# Winform .net6自绘的圆形进度条

using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;namespace Net6_GeneralUiWinFrm {public class CircularProgressBar : Control{private int progress 0;private int borderWidth 20; // 增加的边框宽度public int Progr…

Android---Jetpack Compose学习004

CompositionLocal 通常情况下,在 Compose 中,数据以参数形式向下流经整个界面树传递给每个可组合函数。但是,对于广泛使用的常用数据(如颜色或类型样式),这可能会很麻烦。 为了支持无需将颜色作为显式参数…