C语言_数据结构总结9:树的基础知识介绍

1. 树的基本术语

  • 祖先 :考虑结点K,从根A到结点K的唯一路径上的所有其它结点,称为结点K的祖先。

  • 子孙 :结点B是结点K的祖先,结点K是B的子孙。结点B的子孙包括:E,F,K,L。

  • 双亲 :路径上最接近结点K的结点称为结点K的双亲。根A是树中唯一没有双亲的结点。

  • 孩子 :k为E的孩子。

  • 兄弟 :有相同双亲的称为兄弟。如K和L。

  • 堂兄弟:双亲在同一层的结点称为堂兄弟。

  • 结点的度 :树中一个结点的孩子个数,称为该节点的度

  • 树的度 :树中结点的最大度数为树的度

  • 分支结点/非终端结点 :度大于0的结点

在分支结点/非终端结点中,每个结点的分支数就是该结点的度

  • 叶结点 :度为0的结点

  • 结点的层次 :从树根开始定义,根结点为第一层,它的孩子为第二层,如何以此类推

  • 树的深度/高度 :树中结点的最大层数

  • 结点的高度 :以该结点为根的`子树的高度`

  • 有序树 :树中结点的各子树从左到右都是有次序的,不能互换

  • 无序树 :有序树以外的树

  • 路径 :树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的

  • 路径长度 :路径上所经过的边的个数

根到每个结点的路径长度的最大值应是树的高度减1

  • 森林 :是 m (m>=0) 棵互不相交的树的集合。

只要把一棵树的根结点删去就成了森林,反之,只要给m棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林变成了树。

2. 树的性质

  1. 树的结点数n等于所有结点的度数之和+1

类推:n = 树中所有的边数之和 + 1

  1. m叉树中第i层上至多有 m^(i-1) 个结点(i>=1)

  2. 高度为h的m叉树至多有 (m^h-1)/(m-1) 个结点

当各层结点数达到最大时,树中至多有1+m+m^2+......+m^h-1=(m^h-1)/(m-1)个结点

  1. 度为m,结点为n的树,最小高度 h = logm(m(n-1)+1)。即让每层的结点数都达到最大时

  2. 度为m,结点为n的树,最小高度 h = n - m + 1。即除了最底层,前h-1层都只有一个结点

3. 二叉树

  • 与树相似,二叉树也以递归的形式定义,二叉树是n(n>=0)个结点的有限集合:
  1. 可以为空二叉树,即n=0

  2. 可以由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树

  • 注意 ,二叉树是一种特殊的树形结构,其特点是每个结点至多有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒,若将次序颠倒了,则成为了另一棵不同的二叉树,另外即使树中结点只有一棵子树,也要区分它是左子树还是右子树。

  • 二叉树 不等于 度为2的有序树

  1. 度为2的有序树至少要有3个结点,但二叉树可以为空。

  2. 度为2的有序树的左右结点是相对而言的,若某个结点只有一个孩子,则无需区分左右次序,但二叉树在这种情况下就要进行区分。即二叉树的结点次序不是相对于另一个结点而言的,而是确定的。

  • 二叉树的性质
  1. 非空二叉树上的叶结点树等于度为2的结点数+1

  2. 非空二叉树的第i层最多有 2^(i-1) 个结点(i>=1)

  3. 高度为h的二叉树,最多有 2^h-1 个结点

4. 满二叉树

  • 一棵高度为h,且有 2^(h-1) 个结点的二叉树称为满二叉树,即二叉树的每层都含有最多的结点。

  • 特点

  1. 叶结点都集中在二叉树的最下面一层

  2. 除叶结点外,每个结点度数均为2

  • 按层序编号:约定编号从根结点开始(根结点编号为1)起,自上而下,自左向右。

每个结点对应一个编号,对应编号为i的结点,若有双亲,则其双亲 |i/2| ,若有左孩子,则左孩子为2i,若有右孩子,右孩子编号为2i+1

5. 完全二叉树

  • 高度为h,有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中的编号为1~n的结点一一对应时,称为完全二叉树

  • 特点

  1. 若i<=|n/2|,则结点i为分支结点,否则为叶结点

树中除了分叉节点就是叶结点,这句话对吗?

这句话不完全对。

在树结构中,节点通常分为内部节点(也称为分支节点)和叶节点。分支节点是有子节点的节点,叶节点是没有子节点的节点。然而,还有一种特殊情况,即树中只有一个根节点,它既不是分支节点(因为没有父节点),也不是叶节点(因为在一般定义下,叶节点是根节点的后代,且没有子节点)。所以树中除了分叉节点和叶结点外,在特殊情况下还可能存在单独的根节点。因此,"树中除了分叉节点就是叶结点" 这句话是不对的。

  1. 叶结点只可能在层次最大的两层上出现。对于最大层次中的叶结点,都依次排列在该层的最左边的位置上。

  2. 若有度为1的结点,则最多只可能有1个,且该结点只有左孩子无右孩子

  3. 按层序编号后,一旦出现某结点的编号i为叶结点或只有左孩子,则编号大于i的结点均为叶结点

  4. 若n为奇数,则每个分支结点都有左右孩子;若为偶数,则除了编号最大的分支结点只有左孩子无右孩子,其余结点都有左右孩子

  5. 当i>1时,结点i的双亲结点的编号为|i/2|,如果有左右孩子,则左孩子编号为2i,右孩子编号为2i+1

  6. 结点i所在的层次(深度)为 |log2(i)| + 1

  7. 具有n个结点的完全二叉树的高度为log2(n+1) 或 log2(n) + 1;

6. 二叉排序树

  • 左子树上所有结点的关键字均小于根结点的关键字;右子树上所有结点的关键字均大于根结点的关键字;左右子树又各是一棵二叉排序树

7.平衡二叉树

  • 树中任意一个结点的左子树和右子树的高度之差的绝对值不超过1

8.正则二叉树

  • 树中每个分支结点都有2个孩子,即树中只有度为0或2的结点

文章如有出错不足处,欢迎评论区指出,如果觉得文章不错,就给我点个赞吧,谢谢!

相关推荐
aigonna4 分钟前
LangChain框架各组件详解与实践指南
算法
张子栋14 分钟前
动态规划总结
算法
dundunmm16 分钟前
对比学习(Contrastive Learning)
人工智能·深度学习·学习·算法·数据挖掘·对比学习
梦想家星空23 分钟前
优化 Java 数据结构选择与使用,提升程序性能与可维护性
java·开发语言·数据结构
手拿菜刀24 分钟前
c++学习系列----002.写文件
开发语言·c++·学习
鹿屿二向箔31 分钟前
在MATLAB/Simulink中建立电池模型(用于BMS仿真)
开发语言·matlab
江沉晚呤时38 分钟前
C# 建造者模式(Builder Pattern)详细讲解
java·开发语言·javascript·数据库·c#·.netcore·net
肖筱小瀟43 分钟前
2025-3-14 leetcode刷题情况(贪心算法)
算法·leetcode·贪心算法
【云轩】1 小时前
STM32驱动代码规范化编写指南(嵌入式C语言方向)
c语言·stm32·elasticsearch
alphaTao1 小时前
LeetCode 每日一题 2025/3/10-2025/3/16
算法·leetcode