二叉查找树、平衡二叉树、红黑树到底怎么插入调整?不用旋转快速实现

时间复杂度

首先二叉查找树、平衡二叉树、红黑树的时间复杂度如下所示:
在这里插入图片描述红黑树和二叉查找树的时间复杂度是一样的,区别在于红黑树并不强制要求平衡,在调整树的过程中耗费的时间更少。

二叉查找树

二叉查找树的插入

步骤:从根节点开始,插入的值比当前节点小,往左,比当前节点大,则往右。
例子:8, 3, 1, 10, 6, 4, 7, 14, 13
在这里插入图片描述

二叉查找树的删除

步骤:

  1. 如果是叶子节点,直接删除
  2. 如果只有左子树或右子树,让后面的子树替代原来节点的位置
  3. 如果既有左子树,又有右子树:
    右子树的最左下节点替代原来的节点
    左子树的最右下节点替代原来的节点

步骤1和2都比较好理解,步骤3两种方式都可以,这么做的原因是我们想要找到的是比当前删除节点大的最小值,或者是比当前节点小的最大值,比如{1,2,3,4,5,6,7,8},要删除5,用4或者6来代替5原本的位置即可。
又由于二叉查找树的中序遍历是有序的:

(左根)根(根右)
所以根节点的左子树的最右节点、根节点的右子树的最左节点就是我们想要的4和6。
例子:
1.直接删除叶子节点
在这里插入图片描述2.只有左子树或右子树,后面的子树替代上来即可
在这里插入图片描述3.左右子树都存在:通过找到左子树的最右节点1,可以替换原来的节点3,也可以通过找到右子树的最左节点4替换原来的节点3。
在这里插入图片描述

平衡二叉树

平衡二叉树即左右子树的高度差不超过1。如果超过了,需要进行调整。

平衡二叉树的插入

步骤:

  1. 插入,按照二叉查找树的插入进行插入即可。
  2. 如果不平衡,进行调整。
    1)从最底下往上找到一棵最小的不平衡子树,找到这棵子树从根节点开始的三个节点,这三个节点应该在插入节点的路径上。
    2)对三个节点按大小重新调整。
    3)对三个节点原来的孩子,最小值节点和最大值的节点只要放回原来的位置即可,对于中间的节点,左放左,右放右。

例子:
1.不需要步骤3的情况:插入67
直接按二叉树插入只需要直接把调整的三个节点放到原来的位置。
在这里插入图片描述2.三个节点有孩子的情况:插入90

在这里插入图片描述
1)找到最小的不平衡子树,显然是以66为根节点的子树。顺着根节点找到连续的三个节点,且这三个节点在90的路径上。
2)按大小排好三个节点。也就是中间大小的是根节点,最小的放左边,最大的放右边。
3)插入到原来的位置。
4)对于它们的孩子节点:60、67、90:
60是66的孩子节点,插入原来的位置;
90是70的孩子节点,插入原来的位置;
67是68的左孩子节点,放到68的左子树:66的空闲位置(左放左)。
在这里插入图片描述3.再看一个左放左、右放右的例子。插入63。
在这里插入图片描述1)找到最小的不平衡子树,显然是以50为根节点的子树。顺着根节点找到连续的三个节点,且这三个节点在63的路径上。
2)按大小排好三个节点。也就是中间大小的是根节点,最小的放左边,最大的放右边。
3)插入到原来的位置。这里就是根节点的位置。
4)对于它们的孩子节点:26、60、67、70:
26是50的孩子节点,插入原来的位置;
70是68的孩子节点,插入原来的位置;
60是66的左孩子节点,放到66的左子树:50的空闲位置(左放左)。
67是66的右孩子节点,放到66的右子树:68的空闲位置(右放右)。
在这里插入图片描述

平衡二叉树的删除

  1. 按照二叉查找树的方法来删除,找到一个节点替换原来的节点

  2. 按照平衡二叉树的调整方法进行调整。

红黑树

二叉查找树在极度不平衡的情况下查找效率很低,红黑树是一种自平衡的二叉查找树,除了具备二叉查找树的基本特性外,还具有下列附加特性:

1.节点是红的或者黑的

2.根节点是黑的

3.叶子节点是空的黑色节点

4.如果节点是红的,它的子节点必然是黑的

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树的插入

步骤:确定插入位置 -> 调整平衡

  1. 插入的位置为根节点,则变黑

  2. 否则插入为红色节点(为了保证黑色节点数目相同)
    1)叔叔节点为红色,上三角反色。
    如果根节点反色变成了红色,需要再让根节点变回黑色。
    再观察爷爷节点是否违反了规则,如果违反了继续按步骤调整。
    在这里插入图片描述

    2)叔叔节点为黑色,向上的三个节点重组为上三角,最顶上的节点为黑色,两个孩子节点为红色。
    重组后红色节点的孩子还是按照原来的排列,黑色的父亲节点原来的孩子:左边的孩子给父亲节点的左边,右边的孩子给父亲节点的右边(左给左,右给右)。
    例子:插入节点28
    插入节点28
    28的叔叔节点25为红色,将三角区域反色。反色后发现26违反了规则,对其进行调整。
    在这里插入图片描述
    26的叔叔节点10为黑色,从26开始找到连续的三个节点,并对其重新排序。将根节点置为黑色,两个孩子节点置为红色。
    在这里插入图片描述
    将它们的孩子节点插入原位。其中20、30下面是空的,所以它们的孩子节点10、35可以直接插入原来的位置,26的原来的孩子节点25、27不能直接放在26的下面,他的左孩子25放到他的左子树,20右孩子27放到他的右子树30(左放左,右放右)。
    在这里插入图片描述
    再以{20,10,5,30,40,57,3,2,4,35,25,18,22,23,24,19,18}这个序列构建红黑树来巩固过程:
    1.插入20和10:20为根节点,置为黑色,10为非根节点,置为红色,都没有违反红黑树规则。
    在这里插入图片描述2.插入5:出现连续的红色,对节点5调整,其叔叔节点为黑色,按方法2调整。
    在这里插入图片描述3.插入30,调整
    在这里插入图片描述4.插入40,调整
    在这里插入图片描述5.插入57,调整
    在这里插入图片描述6.插入3,不用调整
    在这里插入图片描述
    7.插入2,调整
    在这里插入图片描述
    8.插入4,调整
    在这里插入图片描述
    9.插入35、25、18都不用调整
    在这里插入图片描述10.插入22,调整
    在这里插入图片描述
    11.插入23,调整
    在这里插入图片描述12.插入24,调整。
    在这里插入图片描述
    在这里插入图片描述
    13.插入19,不用调整
    在这里插入图片描述

14.插入18,调整
在这里插入图片描述

红黑树的删除

  1. 按照二叉查找树的删除步骤进行删除
  2. 进行调整
  3. 如果删除的是红色节点,不用调整,红黑树的性质依然保留
  4. 如果删除的是黑色节点,破坏了红黑树的规则,对红黑树进行调整
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值