提示信息

数据结构编程实践:Python版系列第8讲——红黑树

阿砰 已关注

红黑树是一种自平衡的二叉搜索树,它确保树的路径从根到叶子的最长的一条不会超过最短的一条的两倍,通过添加颜色属性来约束树的平衡性。下面是红黑树的一些基本性质和Python实现示例,以帮助你理解红黑树的工作方式。

红黑树性质

  1. 每个节点是红色或黑色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL节点,空节点)是黑色。
  4. 如果一个节点是红色,则它的两个子节点都是黑色。
  5. 从任何节点到其每个叶子的所有路径都包含相同数量的黑色节点。

这些性质保证了红黑树的平衡性,从而实现O(log n)的时间复杂度来执行查找、插入和删除操作。

Python实现概述

以下是红黑树的简单实现示例,包含插入和基础结构代码。为了简化演示,叶子节点初始化有助于理解树的结构:

  1. class Node:
  2. def __init__(self, data, color='red', parent=None, left=None, right=None):
  3. self.data = data
  4. self.color = color
  5. self.parent = parent
  6. self.left = left
  7. self.right = right
  8. class RedBlackTree:
  9. def __init__(self):
  10. self.NIL_LEAF = Node(data=None, color='black') # Sentinel node to represent nil
  11. self.root = self.NIL_LEAF
  12. def rotate_left(self, node):
  13. right_child = node.right
  14. node.right = right_child.left
  15. if right_child.left != self.NIL_LEAF:
  16. right_child.left.parent = node
  17. right_child.parent = node.parent
  18. if node.parent is None:
  19. self.root = right_child
  20. elif node == node.parent.left:
  21. node.parent.left = right_child
  22. else:
  23. node.parent.right = right_child
  24. right_child.left = node
  25. node.parent = right_child
  26. def rotate_right(self, node):
  27. left_child = node.left
  28. node.left = left_child.right
  29. if left_child.right != self.NIL_LEAF:
  30. left_child.right.parent = node
  31. left_child.parent = node.parent
  32. if node.parent is None:
  33. self.root = left_child
  34. elif node == node.parent.right:
  35. node.parent.right = left_child
  36. else:
  37. node.parent.left = left_child
  38. left_child.right = node
  39. node.parent = left_child
  40. def insert(self, data):
  41. new_node = Node(data)
  42. new_node.left = self.NIL_LEAF
  43. new_node.right = self.NIL_LEAF
  44. parent = None
  45. current = self.root
  46. while current != self.NIL_LEAF:
  47. parent = current
  48. if new_node.data < current.data:
  49. current = current.left
  50. else:
  51. current = current.right
  52. new_node.parent = parent
  53. if parent is None:
  54. self.root = new_node
  55. self.root.color = 'black'
  56. elif new_node.data < parent.data:
  57. parent.left = new_node
  58. else:
  59. parent.right = new_node
  60. new_node.color = 'red'
  61. self._fix_insert(new_node)
  62. def _fix_insert(self, node):
  63. while node != self.root and node.parent.color == 'red':
  64. if node.parent == node.parent.parent.left:
  65. uncle = node.parent.parent.right
  66. if uncle.color == 'red':
  67. node.parent.color = 'black'
  68. uncle.color = 'black'
  69. node.parent.parent.color = 'red'
  70. node = node.parent.parent
  71. else:
  72. if node == node.parent.right:
  73. node = node.parent
  74. self.rotate_left(node)
  75. node.parent.color = 'black'
  76. node.parent.parent.color = 'red'
  77. self.rotate_right(node.parent.parent)
  78. else:
  79. uncle = node.parent.parent.left
  80. if uncle.color == 'red':
  81. node.parent.color = 'black'
  82. uncle.color = 'black'
  83. node.parent.parent.color = 'red'
  84. node = node.parent.parent
  85. else:
  86. if node == node.parent.left:
  87. node = node.parent
  88. self.rotate_right(node)
  89. node.parent.color = 'black'
  90. node.parent.parent.color = 'red'
  91. self.rotate_left(node.parent.parent)
  92. self.root.color = 'black'
  93. # 示例用法
  94. rbt = RedBlackTree()
  95. rbt.insert(10)
  96. rbt.insert(18)
  97. rbt.insert(7)
  98. rbt.insert(15)
  99. rbt.insert(16)

说明

  • 旋转操作:在插入过程中,通过左旋和右旋操作来保持自平衡。
  • 插入修正:在每次插入后,需要对树进行调整以满足红黑树的性质,通过染色、旋转等操作来实现。

这只是一个基本的实现,实际应用应考虑诸如删除操作、更多边界情况处理和优化等。但通过上述代码,你可以初步理解红黑树的概念和机制。

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

最近一次登录:2024-11-20 21:13:37   

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