时间复杂度
首先二叉查找树、平衡二叉树、红黑树的时间复杂度如下所示:
红黑树和二叉查找树的时间复杂度是一样的,区别在于红黑树并不强制要求平衡,在调整树的过程中耗费的时间更少。
二叉查找树
二叉查找树的插入
步骤:从根节点开始,插入的值比当前节点小,往左,比当前节点大,则往右。
例子:8, 3, 1, 10, 6, 4, 7, 14, 13
二叉查找树的删除
步骤:
- 如果是叶子节点,直接删除
- 如果只有左子树或右子树,让后面的子树替代原来节点的位置
- 如果既有左子树,又有右子树:
用右子树的最左下节点替代原来的节点
用左子树的最右下节点替代原来的节点
步骤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)对三个节点按大小重新调整。
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.根节点是黑的
3.叶子节点是空的黑色节点
4.如果节点是红的,它的子节点必然是黑的
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
红黑树的插入
步骤:确定插入位置 -> 调整平衡
-
插入的位置为根节点,则变黑
-
否则插入为红色节点(为了保证黑色节点数目相同)
1)叔叔节点为红色,上三角反色。
如果根节点反色变成了红色,需要再让根节点变回黑色。
再观察爷爷节点是否违反了规则,如果违反了继续按步骤调整。
2)叔叔节点为黑色,向上的三个节点重组为上三角,最顶上的节点为黑色,两个孩子节点为红色。
重组后红色节点的孩子还是按照原来的排列,黑色的父亲节点原来的孩子:左边的孩子给父亲节点的左边,右边的孩子给父亲节点的右边(左给左,右给右)。
例子:插入节点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,调整
红黑树的删除
- 按照二叉查找树的删除步骤进行删除
- 进行调整
- 如果删除的是红色节点,不用调整,红黑树的性质依然保留
- 如果删除的是黑色节点,破坏了红黑树的规则,对红黑树进行调整