二叉查找树又叫二叉搜索树,也叫二叉排序树
特点:
二叉搜索树 也叫 二叉查询树 也叫 二叉排序树
特点:
节点A,左节点值小于A,右节点值大于A;
任意节点的左子树不空,左子树上所有节点的值均小于它的根节点的值;
任意节点的右子树不空,右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉搜索树。
没有键值相等的节点。
对二叉查找树进行中序遍历,即可得到有序的数列
- AVL是一颗高度平衡的二叉树,查询的时间复杂度是 O(logN)
- 左右子树高度差的绝对值不能超过1
左旋:将节点的右支往左拉,右子节点变父节点,晋升之后多余的左子节点让给降级节点当右子节点
右旋:将节点的左支往右拉,左子节点变父节点,晋升之后多余的右子节点让给降级节点当左子节点
二叉树的四种遍历方式:先序遍历、中序遍历、后序遍历、层序遍历
A B C D E F G
- 红黑树是每个节点都带有颜色属性的二叉查找树(红/黑)
- 红黑树从根到叶子的最长路径不会超过最短路径的2倍,解决了二叉查找树容易不平衡的缺陷,提高了读取性能。
- 红黑树在插入或删除的地方比AVL树的效率更高。
NIL 即 Nothing In Leaf。NIL 节点是一种虚拟节点,出现于任何实际子节点不足 2 个的节点上(一个子节点都没有的节点上)
NIL 节点主要是为了避免新增或删除节点后,违反红黑树特性5。
例如:删除节点后如果不变色,可能根节点到A叶子长度为3,到B叶子长度为2
加深对NIL节点的理解,举个例子:
删除0001和0005节点后如下图所示:
在不考虑 NIL 节点的情况下,有些人会误认为红黑树已经平衡。但实际情况并非如此。加上NIL节后点如下图所示:
0006到NIL节点的路径有的2个黑色节点,有的3个黑色节点。违反了特性5:任一节点到其每个叶子的路径都包含相同数量的黑色节点
插入新节点后,红黑树通过旋转+变色保持平衡,举个栗子
左右 【左子节点的右子节点位置插入新节点】
新插入的 A 是父节点 B 的右子节点,B 是 A 祖父节点的左子节点时。维持平衡需要:左旋 --> 右旋 --> 变色,化如图所示:
右左 【右子节点的左子节点位置插入新的节点】
新插入的 A 是 B 的左子节点,而 B 是 A 的祖父节点的右子节点时。维持平衡需要:右旋 --> 左旋 --> 变色,如图所示:
此时,A、B、B 的兄弟节点都是红色
这种情形比较简单,将 B、B 的兄弟节点置为黑色,同时将 A 的祖父节点 C 置为红色,即可保持两分支的黑色节点数量相同。红黑树的变化如图所示: