目录
一、树
1.树的概念
树是一种非线性的数据结构,它是由 n(n >= 0)个有限节点组成的一个具有层次关系的集合。
我们之所以把它成为 "树",是因为它很像我们现实生活中的树。只是它是倒过来的,根朝上叶子朝下。
2.树的结构
① 有一个特殊的节点,成为根节点,根节点不存在前驱节点。
② 除根节点外,其余节点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm,期中没一个集 合 Ti(1 <= i <= m) 又是一颗结构于树类似的字数。每颗子树的节点有且只有一个前驱,可以有 0个或多个后继。
③ 因此,树是递归定义的。因为任何树都会被分成根和子树。
注意:树型结构中,子树之间不能有交集,否则就不是树形结构。
3.树的专有名词
💧 节点的度:一个节点含有的子树的个数称为该节点的度。 比如上图中,A的度为6。
🍃 叶子结点:又称终端节点,度为0的节点称为叶子结点。 比如上图中,BCHIPQ等节点就是叶子结点,因为它们的度为0。
➰ 分支节点:又称非终端节点,度不为0的节点称为分支节点。 比如上图中,DEFG等节点就是分支节点,因为他们的度不为0。
👨 父节点:又称双亲结点,若一个节点有子节点,则这个节点称作其子节点的父节点。 比如上图中,A是B的父节点。
👶 子节点:又称孩子节点,若一个节点有根节点,则称为该节点的子节点。 如上图,B是A的子节点。
👦 兄弟节点:具有相同父节点的节点互相称为兄弟节点。 同一个父亲生的才算。如上图,B和C是兄弟节点,它们的父节点都是A。
🌳 树的度:一棵树中最大的节点的度称为树的度。 如上图,最大的节点是A,有6个子树,故A的度为6,所以树的度为6。
💭 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。 也有将根定义为第0层,根的子节点为第1层的。但是我们建议还是使用根为第1层来定义比较好。
🌊 树的高度:又称树的深度,树中节点的最大层次。 如上图,树的高度为 4。
👱♂️ 堂兄弟节点:父节点在同一层的节点,它们互为堂兄弟。如上图,H 和 I 互为堂兄弟。
🧔 节点的祖先:从根到该节点所经分支上的所有节点。 如上图·,A是所有节点的祖先。
👨👦👦 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。 如上图,所有节点都是A的子孙。
🌄 森林:由 m(m > 0) 棵互不相交的树的集合称为森林。 比如并查集,多个树构成森林。
4.树的表示
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间 的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法 等。我们这里就简单的了解其中最常用的孩子兄弟表示法。
typedef int DataType;
struct Node
{
struct Node* _firstChild1;
struct Node* _pNextBrother;
DataType _data;
};
5.树在实际中的运用
文件中的运用
二、二叉树
1.二叉树的概念
二叉树是n个结点的有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。
二叉树的特点:
每个结点最多有两个棵子树,即二叉树不存在度大于2的结点。
二叉树的子树有左右之分,其子树的次序不能颠倒。
注意:对于任意的二叉树都是由以下几种情况复合而成的:
2.特殊二叉树
满二叉树
📚 定义:一个二叉树,如果每一层的节点数都达到了最大值(均为2),则这个二叉树就可以被称作为 "满二叉树" 。
📜 换言之,如果一个二叉树的层数为 ,且节点总数是 ,则他就是一个满二叉树。
🔺 计算公式:
① 已知层数求总数:
② 已知总数求层数:
完全二叉树
📚 定义:对于深度为 的,有 个结点的二叉树,当且仅当其每一个结点都与深度为 的满二叉树中编号从 1 至 的结点一一对应时称之为完全二叉树。
📜 前 层是满的,最后一层不满,但是最后一层从左到右是连续的。
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。所以,满二叉树是一种特殊的完全二叉树(每一层节点均为2)。
📚 常识:
① 完全二叉树中,度为 1 的最多只有 1 个。
② 高度为 的完全二叉树节点范围是
3.二叉树的性质
性质一:若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2i-1个结点。
性质二:若规定根结点的层数为1,则深度为h的二叉树的最大结点数为2h-1个。
性质三:对任何一棵二叉树,如果度为0的叶结点个数为n0,度为2的分支结点个数为n2,则 有n0 = n2+1。
性质四:若规定根结点的层数为1,则具有N个结点的满二叉树的深度h = log2(N+1)。
性质五:对于具有N个结点的完全二叉树,如果按照从上至下、从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点:
若 i > 0,则该结点的父结点序号为:( i - 1) / 2;若 i = 0,则无父结点。
若2i + 1 < N,则该结点的左孩子序号为:2i + 1;若2i + 1 >= N,则无左孩子。
若2i + 2 < N,则该结点的右孩子序号为:2i + 2;若2i + 2 >= N,则无右孩子。
小练习:
1.某二叉树共有399个结点,其中199个度为2的结点,则该二叉树中的叶子结点数为( )。
A.不存在这样的二叉树
B.200
C.198
D.199
2.在具有2n个结点的完全二叉树中叶子结点个数为( )。
A.n
B.n+1
C.n-1
D.n/2
3.一棵完全二叉树的结点数为531,那么这棵树的高度为( )。
A.11
B.10
C.8
D.12
4.一个具有767个结点的完全二叉树,其叶子结点个数为( )。
A.383
B.384
C.385
D.386
解析:
1.(答案:B)根据性质三,叶子结点(度为0)的个数200个,由于199+200 = 399(该二叉树的总结点数),所以该二叉树的叶子结点数为200。
2.(答案:A)根据性质三,度为0的结点数和度为2的结点数之和应为奇数,因为该完全二叉树的结点总数为2n(偶数),所以二叉树中必然存在一个度为1的结点。于是可以推出:度为0的结点和度为2的结点总共有2n-1个。性质三:对任何一棵二叉树,度为0的叶结点个数比度为2的分支结点个数多1,所以该二叉树度为1的结点个数为n-1,度为0的结点数(即叶结点数)为n。
注意理解:任何一棵完全二叉树中度为1的结点要么有1个,要么就没有度为1的结点。因为完全二叉树的最后一层的结点必须是从左到右连续的,而位于最后一层之前的层数的结点的度均为2。
3.(答案:B)假设该完全二叉树的层数为K,则该完全二叉树的前K-1层的结点总数为2K-1-1,若该完全二叉树是满二叉树,则该满二叉树的结点总数为2K-1,所以深度为K的完全二叉树的结点总数范围为:2K-1-1 < N <= 2K-1。因为29 < 531 <= 210,所以该完全二叉树的高度为10。
注意记忆:210 = 1024。
4.(答案:B)该题与第2题的道理是一样的,因为该树的结点总数为767(奇数),所以该树中不存在度为1的结点,度为2的结点个数为383,度为0的结点个数为384,即叶子结点个数为384。