一、树
1. 定义
是一种 数据结构 是由 n(n≥1) 个有限节点组成一个具有层次关系的 集合 。把它叫做“树”是因为它看起来像是一颗倒挂的树,也就是说它的根朝上,而叶子朝下。
树是N个节点的有限集(n≥0)。当N=0时,称为空树。在任意一个非空树中,有如下的特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称之为根节点;
- 一颗树形结构中,有且仅有一个根节点;
- 每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树。
如上图,许多逻辑可能存在着一对多或者多对多的情况。四川省包含了很多个城市,每个城市又包含了很多个区县。
如下图所示:根、子树、叶子节点组成的树形结构:
树的专业术语,如下图:
如上图所示,节点1的上一级节点,被称为1的父节点。从节点1衍生出来的节点被称为1的孩子节点。和节点1同级别的节点被称为1的兄弟节点。树的最大层级数,被称为树的高度。上面图上的树,高度为4。
2. 关键字
- 节点:二叉树中每个元素都称为节点
根节点、父节点、子节点、兄弟节点
- 空树:一棵树可以没有任何的节点
一棵树也可以只有一个节点,也就是只有根节点
- 子树:左子树、右子树
节点下方左面的是左子树、右面的是右子树
- 度:节点所拥有的子树的数目称为该节点的度
- 度 = 节点的总数 - 1
- 叶子节点的度为0
- 节点的度:子树的个数
- 树的度:所有节点度中的最大值
- 叶子节点:度为0的节点
- 非叶子节点:度不为0的节点
- 层数:根节点在第1层,根节点的子节点在第2层,以此类推
- 节点的深度:从根节点到当前节点的唯一路径上的节点总数
- 节点的高度:从当前节点到最远叶子节点的路径上的节点总数
- 树的深度:所有节点深度中的最大值
- 树的高度:所有节点高度中的最大值
树的深度 = 树的高度
- 有序树:树中任意节点的子节点之间有顺序关系
- 无序树:树中任意节点的子节点之间没有顺序关系
二、二叉树
1. 定义
是树形结构中的一种特殊形式。此树形结构中,每个节点最多有两个节点,也可能是没有节点或者一个子节,但不能超过两个子节点
左面的被称为左孩子,右面的被称为右孩子
2. 特点
- 每个节点的度最大为2(最多可以拥有两颗子树)
- 左子树和右子树是有顺序的
- 即使
- 某节点只有一颗子树,也要区分左右子树
3. 性质
- 非空二叉树的第 i 层,最多有 2 ^ [i - 1]个节点(i ≥ 1)
- 在高度为h的二叉树上最多有2 ^ [h - 1[个节点(h ≥ 1)
- 对于任何一个非空二叉树,如果叶子节点个数为n0,度为2的节点个数为n2,则有:n0 = n2 + 1
- 假设有度为1的节点个数为n1,那么二叉树的节点总数n = n0 + n1 + n2
- 二叉树的边数 T = n1 + 2 * n2 = n - 1 = n0 + n2 - 1
- 因此n0 = n2 + 1
4. 类型
- 真二叉树
概念:所有节点的度要么都为0,要么为2
- 满二叉树
概念:最后一层节点的度都为0,其他节点的度都为2
性质: - 假设满二叉树的高度为h(h≥1),那么有:
- 第 i 层的节点数量:2 ^ [i - 1];
- 叶子节点数量:2 ^ [h - 1];
- 总节点数量n,则n = 2 ^ [h - 1] = 2 ^ [0] + 2^ [1] + 2 ^ [2] + … + 2 ^ [h - 1];
- h = log_2 n + 1
- 同样高度的二叉树中,满二叉树的叶子节点数量最多,总节点数量最多
- 满二叉树一定是真二叉树,真二叉树不一定是满二叉树
- 完全二叉树
概念:叶子节点只会出现最后 2 层,且最后 1 层的叶子结点都靠左对齐
完全二叉树与满二叉树是很相似的,所以也可以这么定义,完全二叉树:对节点从上至下、左至右开始编号,其所有编号都能与相同高度的满二叉树中的编号对应
- 完全二叉树从根节点至倒数第二层是一颗满二叉树
- 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
- 性质:
- 度为1的节点只有左子树,度为1的节点要么是1个,要么是0个
- 同样节点数量的二叉树。完全二叉树的高度最小(从上往下,从左往右满排布)
- 假设完全二叉树的高度为h(h ≥ 1 ),那么有:
- 至少有 2^{h−1} 个节点, 2^{0} + 2^{1} + 2^{2} + … + 2^{h-2}+ 1
- 最多有 2^{h}−1 个节点( 满二叉树 ), 2^{0} + 2^{1} + 2^{2} + … + 2^{h-1}
- 假设总节点数量为n
- 2{h−1} <= 2^{h}
- h-1 <= log_2 n < h
- h = foor (log_2 n) + 1
floor 是向下取整,另外,ceiling 是向上取整
- 特点:
设 完全二叉树 节点总数为n,那么有如下结论:
- n为奇数时,完全二叉树中没有度为1的节点:我们可以这样看,完全二叉树第一层有一个节点,若想完全二叉树的总结点数是奇数,下面的每一行节点数都必须是偶数。所以,每个节点要么度为0,要么度为2。此时 n = n0 + n2
- n为偶数时,完全二叉树中只有一个度为1的节点:完全二叉树第一层有一个节点,若想总节点数为偶数,最后一层必须是奇数个节点。那么单独出来的这个节点的双亲,度就为1。而且也只有它一个度为1的节点。 此时 n = n0 + 1 + n2
5. 应用
- 二叉查找树
在二叉树的基础上增加了以下条件
- 如果当前节点的左子树不为空,则左子树上所有的节点的值均小于当前节点的值。
- 如果当前节点的右子树不为空,则右子树上的所有节点的值均大于当前节点的值。
- 左右子树也都满足上述两个条件。
如下图
以上图为例,我们要查询 5的节点步骤如下:
- .访问根节点6,发现5<6,我们要找的5在根节点的左孩子树中。
- 访问根节点的左孩子4,发现5>4,我们要找的5在节点4的右孩子中。
- 访问节点4的右孩子,发现5=5,这就是我们要找的节点5。
在二叉查找树中,左子树小于父节点,右子树大于父节点,因此保证了二叉树的顺序。所以二叉查找树又被称为二叉排序树。
- 顺序存储
在新增数据的时候,仍要遵循二叉查找树的基本原则。
下图是准备好的一颗二叉排序树:
- 假设现在要将 10存入上图的二叉树中,由于10>6,走右边,10>7,继续走右边,10>8继续走右边。所以10会插入到8的右孩子位置,如下图:
- 假设现在继续将9插入树中,由于9>6,9>7,9>8,且9<10,所以9应该在6/7/8的右边且在10的左边,如下图: