二叉搜索树、AVL树、红黑树详解

1. 二叉查找树

二叉查找树又叫二叉搜索树,也叫二叉排序树

特点:

  • 若任意节点的左子树不为空,左子树上所有节点的值均小于他根节点的值;
  • 若任意节点的右子树不为空,右子树上所有节点的值均大于他根节点的值;
  • 任意节点的左、右子树也分别是二叉搜索树;
  • 没有键值相等的节点;

2. 二叉搜索树

二叉搜索树 也叫 二叉查询树 也叫 二叉排序树

特点:

  • 节点A,左节点值小于A,右节点值大于A;

  • 任意节点的左子树不空,左子树上所有节点的值均小于它的根节点的值;

  • 任意节点的右子树不空,右子树上所有节点的值均大于它的根节点的值;

  • 任意节点的左、右子树也分别为二叉搜索树。

  • 没有键值相等的节点。

  • 对二叉查找树进行中序遍历,即可得到有序的数列


3. 二叉平衡树 AVL

  • AVL是一颗高度平衡的二叉树,查询的时间复杂度是 O(logN)
  • 左右子树高度差的绝对值不能超过1

3.1 左旋&右旋

  • 左旋:将节点的右支往左拉,右子节点变父节点,晋升之后多余的左子节点让给降级节点当右子节点

  • 右旋:将节点的左支往右拉,左子节点变父节点,晋升之后多余的右子节点让给降级节点当左子节点

3.2 二叉平衡树失衡的4种情况及如何处理

  1. 左左:节点A的左子树的左子树上有新的节点加入,导致与节点A右子树高度差为2,解决办法:右旋
  2. 右右:节点A的右子树的右子树上有新的节点加入,导致与节点A左子树高度差为2,解决办法:左旋
  3. 左右:节点A的左子树的右子树上有新的节点加入,导致与节点A的右子树高度差为2,解决办法:先左旋,在右旋
  4. 右左:节点A的右子树的左子树上有新的节点插入,导致与节点A的左子树高度差为2,解决方法:先右旋,在左旋

3.3 二叉树的遍历

二叉树的四种遍历方式:先序遍历、中序遍历、后序遍历、层序遍历

  1. 先序遍历:先输出根节点,在遍历左节点,在遍历右节点

  1. 中序遍历:先遍历左节点、在输出根节点,在遍历右节点

image-20220811181512054

  1. 后序遍历:先遍历左节点,在遍历右节点,在输出根节点

image-20220812101521274

  1. 层序遍历:从上到下,从左到右,依次输出

​ A B C D E F G



4. 红黑树 red-black-tree

  • 红黑树是每个节点都带有颜色属性的二叉查找树(红/黑)
  • 红黑树从根到叶子的最长路径不会超过最短路径的2倍,解决了二叉查找树容易不平衡的缺陷,提高了读取性能。
  • 红黑树在插入或删除的地方比AVL树的效率更高。

4.1 红黑树特点

  • 节点有红黑两种颜色
  • 根节点是黑色
  • 叶子节点都是黑色的空节点(NIL节点)
  • 每个红色节点下面的两个子节点都是黑色。(每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 任一节点到其每个叶子的路径都包含相同数量的黑色节点
image-20220824104313968

4.2 红黑树 NIL 节点

NIL 即 Nothing In Leaf。NIL 节点是一种虚拟节点,出现于任何实际子节点不足 2 个的节点上(一个子节点都没有的节点上)

NIL 节点主要是为了避免新增或删除节点后,违反红黑树特性5。

例如:删除节点后如果不变色,可能根节点到A叶子长度为3,到B叶子长度为2

加深对NIL节点的理解,举个例子🌰:

删除0001和0005节点后如下图所示:
在这里插入图片描述

在不考虑 NIL 节点的情况下,有些人会误认为红黑树已经平衡。但实际情况并非如此。加上NIL节后点如下图所示:

0006到NIL节点的路径有的2个黑色节点,有的3个黑色节点。违反了特性5:任一节点到其每个叶子的路径都包含相同数量的黑色节点

image-20220825114515784

4.3 红黑树插入节点

插入新节点后,红黑树通过旋转+变色保持平衡,举个栗子🌰

  1. 在0007的左子节点的右子节点上,插入 A 【图二所示】
  2. 将 B 左旋【图三所示:此时的情形与首次插入的 A 位于 B 的左侧的情形完全相同】
  3. 然后将A右旋【图四】
  4. 然后变色【图五】

在这里插入图片描述



4.4 插入后保持平衡

🍉情况一:要插入的节点A的父节点B的兄弟节点是黑色:

左右 【左子节点的右子节点位置插入新节点】
新插入的 A 是父节点 B 的右子节点,B 是 A 祖父节点的左子节点时。维持平衡需要:左旋 --> 右旋 --> 变色,化如图所示:

右左 【右子节点的左子节点位置插入新的节点】
新插入的 A 是 B 的左子节点,而 B 是 A 的祖父节点的右子节点时。维持平衡需要:右旋 --> 左旋 --> 变色,如图所示:

🍉情况二:要插入节点A的父节点B的兄弟节点是红色:

此时,A、B、B 的兄弟节点都是红色
这种情形比较简单,将 B、B 的兄弟节点置为黑色,同时将 A 的祖父节点 C 置为红色,即可保持两分支的黑色节点数量相同。红黑树的变化如图所示:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值