遇到面试官要求手写红黑树,请把链接给他看

《算法导论》公开课中有一名讲师,他叫Erik Demaine。12岁就进入了Dalhousie大学,2年后,14岁即拿到学士学位。之后进入waterloo大学读博,15岁时拿到数学硕士学位,2001年20岁时拿到博士学位,其博士论文被评为加拿大最优秀的4篇论文之一。

这位同学拿到博士学位后,直接就被MIT计算科学与人工智能实验室聘为助理教授,以20岁的年纪成为MIT历史上最年轻的教授。2003年,年仅22岁获得麦克阿瑟天才奖。2005年,以24岁的年纪升为副教授有兴趣的话(

然而,他在公开课讲了一句话,如图所示 (http://open.163.com/movie/2010/12/7/S/M6UTT5U0I_M6V2TTJ7S.html, 开头几分)

 

以前都觉得好惭愧,觉得自己没有努力学好。后来发现,这些精妙的算法如果你自己没有书本,靠自己能推导出来,那你都可以拿学术奖了。所以如果你能写出来,那么你的记忆力真的很惊人。

也许中国人太聪明了,就像电影《中国合伙人》里讲的,外国人无法理解到中国人记忆力有多强,中国人的考试能力太强了。

转载于:https://www.cnblogs.com/studyNT/p/7857839.html

红黑树是一种自平衡的二叉搜索树,它的平衡保证了在最坏情况下的查找、插入和删除操作的时间复杂度均为 O(log n)。红黑树的每个节点都有一个颜色属性,可以是红色或黑色。在插入和删除节点时,需要通过变换节点的颜色和旋转子树来保证树的平衡。 下面是一个简单的红黑树的实现,包含节点的插入、删除和查找操作: ```python class Node: def __init__(self, key, value): self.key = key self.value = value self.left = None self.right = None self.color = "RED" class RedBlackTree: def __init__(self): self.root = None def insert(self, key, value): node = Node(key, value) if self.root is None: node.color = "BLACK" self.root = node else: parent = None current = self.root while current is not None: parent = current if key < current.key: current = current.left elif key > current.key: current = current.right else: current.value = value return if key < parent.key: parent.left = node elif key > parent.key: parent.right = node node.parent = parent self.balance(node) def delete(self, key): node = self.find(key) if node is None: return if node.left is not None and node.right is not None: successor = node.right while successor.left is not None: successor = successor.left node.key = successor.key node.value = successor.value node = successor if node.left is None and node.right is None: if node.color == "RED": if node.parent.left == node: node.parent.left = None else: node.parent.right = None else: self.balance_delete(node) if node.parent is None: self.root = None else: if node.parent.left == node: node.parent.left = None else: node.parent.right = None elif node.left is not None: node.left.parent = node.parent if node.color == "RED": if node.parent.left == node: node.parent.left = node.left else: node.parent.right = node.left else: self.balance_delete(node.left) if node.parent is None: self.root = node.left else: if node.parent.left == node: node.parent.left = node.left else: node.parent.right = node.left else: node.right.parent = node.parent if node.color == "RED": if node.parent.left == node: node.parent.left = node.right else: node.parent.right = node.right else: self.balance_delete(node.right) if node.parent is None: self.root = node.right else: if node.parent.left == node: node.parent.left = node.right else: node.parent.right = node.right def find(self, key): current = self.root while current is not None: if key < current.key: current = current.left elif key > current.key: current = current.right else: return current return None def balance(self, node): while node.parent is not None and node.parent.color == "RED": if node.parent == node.parent.parent.left: uncle = node.parent.parent.right if uncle is not None and uncle.color == "RED": node.parent.color = "BLACK" uncle.color = "BLACK" node.parent.parent.color = "RED" node = node.parent.parent else: if node == node.parent.right: node = node.parent self.rotate_left(node) node.parent.color = "BLACK" node.parent.parent.color = "RED" self.rotate_right(node.parent.parent) else: uncle = node.parent.parent.left if uncle is not None and uncle.color == "RED": node.parent.color = "BLACK" uncle.color = "BLACK" node.parent.parent.color = "RED" node = node.parent.parent else: if node == node.parent.left: node = node.parent self.rotate_right(node) node.parent.color = "BLACK" node.parent.parent.color = "RED" self.rotate_left(node.parent.parent) self.root.color = "BLACK" def balance_delete(self, node): while node is not self.root and node.color == "BLACK": if node == node.parent.left: sibling = node.parent.right if sibling.color == "RED": sibling.color = "BLACK" node.parent.color = "RED" self.rotate_left(node.parent) sibling = node.parent.right if sibling.left.color == "BLACK" and sibling.right.color == "BLACK": sibling.color = "RED" node = node.parent else: if sibling.right.color == "BLACK": sibling.left.color = "BLACK" sibling.color = "RED" self.rotate_right(sibling) sibling = node.parent.right sibling.color = node.parent.color node.parent.color = "BLACK" sibling.right.color = "BLACK" self.rotate_left(node.parent) node = self.root else: sibling = node.parent.left if sibling.color == "RED": sibling.color = "BLACK" node.parent.color = "RED" self.rotate_right(node.parent) sibling = node.parent.left if sibling.right.color == "BLACK" and sibling.left.color == "BLACK": sibling.color = "RED" node = node.parent else: if sibling.left.color == "BLACK": sibling.right.color = "BLACK" sibling.color = "RED" self.rotate_left(sibling) sibling = node.parent.left sibling.color = node.parent.color node.parent.color = "BLACK" sibling.left.color = "BLACK" self.rotate_right(node.parent) node = self.root node.color = "BLACK" def rotate_left(self, node): right = node.right node.right = right.left if right.left is not None: right.left.parent = node right.parent = node.parent if node.parent is None: self.root = right else: if node == node.parent.left: node.parent.left = right else: node.parent.right = right right.left = node node.parent = right def rotate_right(self, node): left = node.left node.left = left.right if left.right is not None: left.right.parent = node left.parent = node.parent if node.parent is None: self.root = left else: if node == node.parent.right: node.parent.right = left else: node.parent.left = left left.right = node node.parent = left ``` 这里需要注意的是,红黑树的插入和删除操作都需要进行一定的平衡调整,以保证树的平衡性。在代码实现中,我们使用了 `balance` 方法来进行插入节点后的平衡调整,使用了 `balance_delete` 方法来进行删除节点后的平衡调整。同时,为了保证红黑树的性质,我们需要通过颜色变换和旋转子树来进行平衡调整,具体实现可以参考代码中的 `rotate_left` 和 `rotate_right` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值