前言:不知道同学有没有看完昨天的B树和B+树,虽说那个B+树在面试中很少被要求手写,但是有一个常考的考点,红黑树,可以一个经常被问到的知识噢,那么今天,我就来跟大家一起手撕红黑树!
红黑树
说到红黑树不得不先提一下AVL树(平衡二叉搜索树),不了解AVL树的同学可以自行查询相关文献,然后回来以后,请回答我的两个问题:
红黑树和AVL树的区别是什么?
1.附上红黑颜色属性,通过颜色控制树的平衡
2.相对于AVL树来说,没有那么严格的要求平衡
3.插入和删除的复杂度和次数较AVL来说,跟随着数量节点的增大,越能体现出红黑树的快捷
4.叶子节点都是NuLL
那红黑树自己有什么独特的地方吗?
1.红黑树要求根节点和叶子结点都是黑色
2.红黑树的红色节点不可以相连
3.红黑树的根节点到任一叶子节点的距离中,黑色节点都是相同的,俗称黑高
通过上面的图片应该很容易理解到它的特性吧,根据它的颜色属性,我们可以通过颜色的一定规律使得我们的树便平衡,不要问问什么通过红黑的颜色就可以使树平衡,我在刚学的时候也有这个疑问,但是事实证明,先理解,后实现,最后才是深入了解这个规律是如何产生的噢.
在我们手写红黑树之前,一定要捋清楚思路在做,不要以为自己听懂了一遍,就可以直接实现,里面是有很多需要注意的细节,这里小编是建议大家先把整个过程需要的函数和思路先备注上哦,下面是我从老师那里截得图,不过使用java实现的,我呢,则是用python实现的,不过大同小异,只是想告诉你整个过程的书写方式
左旋如图:
右旋如图:
为了方便大家理解,左右旋,附上上述两张图,可以参考,这个可能有点难理解,因为图上仅仅是简单的几个节点,而在真实的树中,它是有很多子节点连接的,当然本质上其实很简单,在下面的代码中,我会体现出它的规律性所在,为了防止大家在观看代码的过程中疑惑,我几乎每步的核心都做了备注,希望大家在看完细致的视频讲解以后,如果没有思路的话,可以从我的代码中了解一下python实现红黑树的细节
Python实现红黑树
# 定义节点
class Node(object):
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.left = None
self.right = None
self.parent = None
self.color = 0 # 默认黑色0,红色1
class RedBlackTree(object):
def __init__(self):
self.root = None
# 设置节点为红色
def set_red_color(self, node):
if node is not None:
node.color = 1
# 设置节点为黑色
def set_black_color(self, node):
if node is not None:
node.color = 0
# 判断是否是红色节点
def is_red_color(self, node):
if node is not None:
if node.color == 1:
return True
else:
return False
else:
return False
# 判断是否是黑色节点
def is_black_color(self, node):
if node is not None:
if node.color == 0:
return True
else:
return False
else:
return False
# 得到爷爷节点
def get_grandparent(self, node):