一、二叉树
- 非空二叉树的第i层,最多有个节点
- 在高度为 h 的二叉树上最多有 个结点
- 对于任何一棵非空二叉树,如果叶子节点个数为 n0,度为 2 的节点个数为 n2,则有: n0 = n2 + 1 (利用边与节点数计算)
- 真二叉树:所有节点的度都要么为 0,要么为 2
- 满二叉树:最后一层节点的度都为 0,其他节点的度都为 2
- 完全二叉树:对节点从上至下、左至右开始编号,其所有编号都能与相同高度的满二叉树中的编号对应
二、二叉搜索树
- 任意一个节点的值都大于其左子树所有节点的值
- 任意一个节点的值都小于其右子树所有节点的值
- 它的左右子树也是一棵二叉搜索树
- 二叉搜索树存储的元素必须具备可比较性
三、平衡二叉搜索树
1. AVL树:每个节点的左右子树高度差不超过 1
- LL – 右旋转(单旋)(g.left = p.right;p.right = g)
- RR – 左旋转(单旋)(g.right = p.left;p.left = g)
2. B树:B树是一种平衡的多路搜索树,多用于文件系统、数据库的实现
- 1 个节点可以存储超过 2 个元素、可以拥有超过 2 个子节点
- 平衡,每个节点的所有子树高度一致
3. 红黑树:相比AVL树,红黑树的平衡标准比较宽松: 没有一条路径会大于其他路径的2倍,是一种弱平衡、黑高度平衡红黑树的最大高度是 2 ∗ log2(n + 1) ,依然是 O(logn) 级别
- 节点是 RED 或者 BLACK
- 根节点是 BLACK
- 叶子节点(外部节点,空节点)都是 BLACK
- RED 节点的子节点都是 BLACK(a, RED 节点的 parent 都是 BLACK; b, 从根节点到叶子节点的所有路径上不能有 2 个连续的 RED 节点)
- 从任一节点到叶子节点的所有路径都包含相同数目的 BLACK 节点
AVL树 vs 红黑树
◼ AVL树
- 平衡标准比较严格: 每个左右子树的高度差不超过1
- 最大高度是 1.44 ∗ log2 n + 2 - 1.328(100W个节点, AVL树最大树高28)
- 搜索、添加、删除都是 O(logn) 复杂度,其中添加仅需 O(1) 次旋转调整、删除最多需要 O(logn) 次旋转调整
◼ 红黑树
- 平衡标准比较宽松: 没有一条路径会大于其他路径的2倍
- 最大高度是 2 ∗ log2(n + 1)(100W个节点,红黑树最大树高40)
- 搜索、添加、删除都是 O(logn) 复杂度,其中添加、删除都仅需 O(1) 次旋转调整
◼ 搜索的次数远远大于插入和删除,选择AVL树;搜索、插入、删除次数几乎差不多,选择红黑树
◼ 相对于AVL树来说,红黑树牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树
◼ 红黑树的平均统计性能优于AVL树,实际应用中更多选择使用红黑树
B树与B+树
4. 二叉堆:二叉堆的逻辑结构就是一棵完全二叉树,所以也叫完全二叉堆
5. 哈夫曼树
- (1),以需要编码字符出现次数为权值,将这些权值作为根节点构建 n 棵二叉树,组成森林
- (2),在森林中选出 2 个根节点最小的树合并,作为一棵新树的左右子树,且新树的根节点为其左右子树根节点之和
- (3),从森林中删除刚才选取的 2 棵树,并将新树加入森林
- (4),重复 2、 3 步骤,直到森林只剩一棵树为止,该树即为哈夫曼树