树与二叉树
基础含义
- 结点的度: 结点拥有的子树数称为结点的度
- 树的度: 树内各结点的度的最大值
- 叶子结点:没有孩子的结点
- 分支结点:描述数据结构中的从根部出发(对有向图而言)有入度和出度的节点,(对无向图而言)不属于叶子节点的节点
- 内部结点:除根结点和叶子结点外的结点
- 父节点: 若一个节点含有子节点
- 子节点: 除根节点之外,并且本身下面还连接有节点的节点
- 兄弟结点: 具有相同父节点的节点
- 层次: “高度”这个概念,其实就是从下往上度量
二叉树的重要特性
- 在二叉树的第i层上最多有
2^(i-1)
个结点(i>=1) - 深度为k的二叉树最多有
2^k - 1
个结点(k>=1) - 对任何一颗二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则
n0 = n2 + 1
- 对一棵有n个结点的完全二叉树的结点按层序编号(从第一层到向下取整[log2 n]+1层,则对任一结点i(1<=i<=n)),有:
- 如果i=1,则结点i无父节点,是二叉树的根
- 如果i>1,则父节点为向下取整[i/2]
- 如果2i>n,则结点i为叶子结点,无左子结点;否则,其左子结点是结点2i
- 如果2i + 1 > n,则结点i无右子结点,否则,其右子结点是结点2i+1
二叉树的遍历
- 前序遍历:(根左右) 在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树
- 中序遍历:(左根右) 在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树
- 后序遍历:(左右根) 在遍历左、右子树时,仍然先遍历左子树,再遍历右子树,最后访问根结点
- 层次遍历:(从左向右,从上到下) 每次出队一个元素,就将该元素的孩子节点加入队列中,直至队列中元素个数为0时,出队的顺序就是该二叉树的层次遍历结果
前序遍历结果:12457836
中序遍历结果:42785136
后序遍历结果:48752631
层次遍历结果:12345678
反向构造二叉树
由前序序列为ABHFDECG;中序序列为HBEDFAGC构造二叉树
由前序可知A为根节点,分为左右子树,接着左子树的根节点为B,H为左子树,EDF为右子树,然后F为其右子树的根节点,DE为左子树,紧接着D为其左子树的根节点,由中序知道E为左子树的叶子节点;到A的右子树C为根节点,G为其的左子树的叶子结点
树转二叉树
- 孩子结点-左子树结点
- 兄弟结点-右孩子结点
查找二叉树
最优二叉树(哈夫曼树)
- 哈夫曼树: 带权路径长度最短的树
- 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径
- 路径长度:路径上的分支数目称作路径长度
- 树的路径长度:从树根到每一结点的路径之和
- 权:赋予某个实体的一个量,是对实体的某个或某些属性的数值描述
例子:假设有一组权值5,29,7,8,14,23,3,11,请尝试构造哈夫曼树
线索二叉树
含义: 来源于二叉树的存储结构中,存在一些空的指针域,因此是否能够将这些空间利用起来,存储一些关于节点间先后顺序的信息
为什么需要线索二叉树?
知道了“前驱”和“后继”信息,就可以把二叉树看作一个链表结构,从而可以像遍历链表那样来遍历二叉树
平衡二叉树
含义: 是一种二叉排序树,其中每一个节点的左子树和右子树的高度差最多等于1
实现原理: 构建二叉排序树的过程中,每当插入一个结点时,先检查否是因为插入而破坏了树的平衡性,若是,这找出最小不平衡树,在满足二叉排序树的特点,将其调整成新的平衡二叉树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)