Python中的红黑树介绍
红黑树(Red-Black Tree),是一种自平衡二叉查找树。在红黑树中,每个结点要么是红色的,要么是黑色的。
红黑树的特点:
-
每个节点不是红色就是黑色;
-
根节点是黑色的;
-
叶子节点(NIL节点,不包含任何数据)是黑色的;
-
如果一个节点是红色的,则它的两个子节点都是黑色的;
-
对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。
红黑树的定义已经讲了,下面来说说它的性质。
红黑树的性质:
-
每个结点要么是红色,要么是黑色;
-
根结点是黑色的;
-
如果一个结点是红色的,那么它的子结点必须是黑色的;
-
对于每个结点,从该结点到叶子结点的每条路径上包含的黑色结点数都相同;
-
空结点(NIL结点)是黑色的。
下面是Python代码实现红黑树:
RED = True BLACK = False class Node: def __init__(self, key, value, color=RED): self.key = key self.value = value self.left, self.right = None, None self.color = color class RedBlackTree: def __init__(self): self.root = None def is_red(self, node): return node is not None and node.color == RED def left_rotate(self, node): x = node.right node.right = x.left x.left = node x.color = node.color node.color = RED return x def right_rotate(self, node): x = node.left node.left = x.right x.right = node x.color = node.color node.color = RED return x def flip_color(self, node): node.color = RED node.left.color = BLACK node.right.color = BLACK def put(self, key, value): def _put(node, key, value): if node is None: return Node(key, value) if key < node.key: node.left = _put(node.left, key, value) elif key > node.key: node.right = _put(node.right, key, value) else: node.value = value if self.is_red(node.right) and not self.is_red(node.left): node = self.left_rotate(node) if self.is_red(node.left) and self.is_red(node.left.left): node = self.right_rotate(node) if self.is_red(node.left) and self.is_red(node.right): self.flip_color(node) return node self.root = _put(self.root, key, value) self.root.color = BLACK def get(self, key): node = self.root while node: if key < node.key: node = node.left elif key > node.key: node = node.right else: return node.value if __name__ == '__main__': t = RedBlackTree() t.put('p', 'pidancode.com') t.put('e', '皮蛋编程') t.put('c', 'Coding') t.put('o', 'Object') t.put('r', 'Red-black') t.put('d', 'Data') print(t.get('p')) print(t.get('e')) print(t.get('c')) print(t.get('o')) print(t.get('r')) print(t.get('d'))
输出结果:
pidancode.com
皮蛋编程
Coding
Object
Red-black
Data
这就是红黑树的完整实现和代码演示。
相关文章