树
术语
- 根
- 孩子
- 叶子:数中没有孩子的元素
- 级:元素的级别 = 父母级别 + 1, 树根的级为1
- 树的高度:树的级数
- 元素的度:孩子数
- 树的度: 元素度最大值
二叉树
- 二叉树可以为空,普通树不可以。
- 二叉树每个元素最多有两个元素
- 二叉树,左右元素是有序的,可以区分,其他树的字数之间是无序的。
二叉树的特性
- 有n个元素的二叉树,有n-1条边
- 二叉树高度为h,最多有 2 h − 1 2^h -1 2h−1个元素,第 i 层有 2 i − 1 2^{i-1} 2i−1个元素
- 有n个元素的二叉树最高为 n ,最小为 ⌈ ( l o g 2 ( n + 1 ) ) ⌉ \left \lceil (log_2(n+1))\right \rceil ⌈(log2(n+1))⌉
- 二叉树中度为 0 的元素数 = 度为 2 元素数 + 1
满二叉树
各层都满,可以对 1 到 2 h − 1 2^h-1 2h−1 进行标号
完全二叉树
- 前h-1 层为满二叉树
- 第h层,连续排于第h层左端
完全二叉树高度 ⌈ ( l o g 2 ( n + 1 ) ) ⌉ \left \lceil (log_2(n+1))\right \rceil ⌈(log2(n+1))⌉
二叉树的数组描述
- 完全二叉树,从上到下从左到右
- 编号从1开始,父节点是 i ,左右孩子分别在 2i 、2i+1
- 二叉树可以看作是缺少了部分元素的完全二叉树
右斜的二叉树存储空间最大
二叉树链表描述
二叉树的遍历方法
- 前序遍历: 访问根元素、遍历左子树、遍历右子树
- 中序遍历: 遍历左子树、访问根节点、遍历右子树
- 后序遍历:遍历左子树、遍历右子树、访问根节点
- 层次比哪里: 从上往下逐层,从左到右的次序访问元素
前序序列和中序序列 或者由后序序列和中序序列能为一确定一棵二叉树
中序序列区分左右子树,前序、后序确定元素顺序。
树和森林的二叉树表示
树的二叉树表示:
二叉树的模拟指针表示
树的父母表示方法:
树的孩子表示法:
前序遍历的非递归实现
线索化二叉树
- 通过二叉树的遍历,将二叉树所有元素排列在一个线性序列中,可以找到某元素的前驱和后继
m叉树
m叉搜索树
特征:
- 每个内部节点最多有m个子女,1~m-1个元素
- 每个含 p个元素的节点,有 p+1 个子女
- 节点内 元素关键字,子树关键字有序排列。
删除
-左右子树都为空,直接删除
- 相邻子树一个不空,从不空的相邻子树中找一个元素替换被删除的元素
- 删除元素相邻子树都不控,从不空的相邻子树中找一个元素替换被删除的元素
m阶B 树
特征:
- 根节点至少两个孩子
- 出了根节点,所有内部节点至少 ⌈ m / 2 ⌉ \left \lceil m/2 \right \rceil ⌈m/2⌉ 个孩子, ⌈ m / 2 ⌉ − 1 \left \lceil m/2 \right \rceil - 1 ⌈m/2⌉−1 个元素
- 所有外部节点都位于同一层
插入
- 当新元素插入到饱和节点时,饱和节点需要被分裂
- 节点从 ed 处分裂此节点, d=
⌈
m
/
2
⌉
\left \lceil m/2 \right \rceil
⌈m/2⌉
删除
-
1 被删除元素的孩子均在外部节点中(元素在树叶中);被删除元素所在的节点有多余最少数目的元素
直接删除就好了 -
2 被删除元素的孩子均在外部节点中(元素在树叶中);被删除元素所在的节点元素数目为最小值
(1) 最邻近的兄弟有多余元素,替换到父节点中,将父节点中的元素换下来
(2) 最临近的兄弟有最少数目元素,将两兄弟和兄弟之间的元素合并成一个节点 -
3 当被删除的元素在非树叶节点中,可以用左相邻子树的最大元素,也可以用右相邻子树的最小元素替换被删除的元素。 使得转成上两种情况
B+ 树
- 既可以顺序查找,又可以随即查找