提示信息

红黑树(RBTree)的概念及实现

漠之欣然 已关注

红黑树(Red-Black Tree)是一种自平衡二叉查找树,每个节点都遵循一些特定的属性,以确保树的高度近似对数级(O(log n)),从而保证了相关操作的时间复杂度是对数级别的。这些特性使得红黑树在插入、删除、查找操作中能够保持相对高效的性能。

红黑树的特性:

  1. 节点颜色:每个节点要么是红色,要么是黑色。
  2. 根节点是黑色:红黑树的根节点始终是黑色。
  3. 叶节点是黑色:红黑树的所有叶节点(通常是NIL或空节点)都是黑色。
  4. 红色节点限制:红节点不能有红色子节点,即从每个叶子到根的所有路径上不能有两个连续的红色节点。
  5. 黑色平衡性:从任一节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。

红黑树的操作:

  • 插入:在红黑树中插入节点后,需要通过"旋转"和"重新着色"来确保树继续保持红黑树的特性。

  • 删除:删除节点时可能会破坏红黑树的特性,也需要通过"旋转"和"重新着色"来恢复。

  • 旋转:旋转是一种用于调整二叉树结构的操作,分为左旋和右旋,用来修正由于插入或删除造成的树的不平衡。

左旋示例:
```伪代码
左旋(节点x):
把x的右子节点y设为当前节点
把y的左子树转移给x的右子树
把x的父节点设为y的父节点
如果x是父节点的左子节点,把y设为父节点的左子节点,否则设为右子节点
把x设为y的左子节点


  1. **右旋是左旋的镜像操作。
  2. ### 红黑树的实现:
  3. 以下是红黑树的一种简单实现,并重点描述插入和修复操作。删除操作类似,但也更为复杂。

class Node:
def init(self, val, color="RED"):
self.val = val
self.color = color
self.left = None
self.right = None
self.parent = None

class RBTree:
def init(self):
self.NIL_LEAF = Node(None, color="BLACK")
self.root = self.NIL_LEAF

  1. def insert(self, val):
  2. new_node = Node(val)
  3. new_node.left = self.NIL_LEAF
  4. new_node.right = self.NIL_LEAF
  5. parent = None
  6. node = self.root
  7. while node != self.NIL_LEAF:
  8. parent = node
  9. if new_node.val < node.val:
  10. node = node.left
  11. else:
  12. node = node.right
  13. new_node.parent = parent
  14. if parent is None:
  15. self.root = new_node
  16. elif new_node.val < parent.val:
  17. parent.left = new_node
  18. else:
  19. parent.right = new_node
  20. self.fix_insert(new_node)
  21. def fix_insert(self, node):
  22. while node != self.root and node.parent.color == "RED":
  23. if node.parent == node.parent.parent.left:
  24. uncle = node.parent.parent.right
  25. if uncle.color == "RED":
  26. uncle.color = "BLACK"
  27. node.parent.color = "BLACK"
  28. node.parent.parent.color = "RED"
  29. node = node.parent.parent
  30. else:
  31. if node == node.parent.right:
  32. node = node.parent
  33. self.left_rotate(node)
  34. node.parent.color = "BLACK"
  35. node.parent.parent.color = "RED"
  36. self.right_rotate(node.parent.parent)
  37. else:
  38. uncle = node.parent.parent.left
  39. if uncle.color == "RED":
  40. uncle.color = "BLACK"
  41. node.parent.color = "BLACK"
  42. node.parent.parent.color = "RED"
  43. node = node.parent.parent
  44. else:
  45. if node == node.parent.left:
  46. node = node.parent
  47. self.right_rotate(node)
  48. node.parent.color = "BLACK"
  49. node.parent.parent.color = "RED"
  50. self.left_rotate(node.parent.parent)
  51. self.root.color = "BLACK"
  52. def left_rotate(self, x):
  53. y = x.right
  54. x.right = y.left
  55. if y.left != self.NIL_LEAF:
  56. y.left.parent = x
  57. y.parent = x.parent
  58. if x.parent is None:
  59. self.root = y
  60. elif x == x.parent.left:
  61. x.parent.left = y
  62. else:
  63. x.parent.right = y
  64. y.left = x
  65. x.parent = y
  66. def right_rotate(self, y):
  67. x = y.left
  68. y.left = x.right
  69. if x.right != self.NIL_LEAF:
  70. x.right.parent = y
  71. x.parent = y.parent
  72. if y.parent is None:
  73. self.root = x
  74. elif y == y.parent.right:
  75. y.parent.right = x
  76. else:
  77. y.parent.left = x
  78. x.right = y
  79. y.parent = x

用法

tree = RBTree()
tree.insert(10)
tree.insert(20)
tree.insert(30)
```

这个实现着重说明了插入和旋转的基本过程。删除操作比较复杂,但也遵循类似的修复机制来确保树始终保持红黑特性。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
漠之欣然 关注 已关注

最近一次登录:2024-11-20 14:18:22   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图