BST插值建树re-balance再平衡构建AVL(Adelson-Velskii & Landis)平衡二叉搜索树,基于networkx、binarytree,implement by Python

x33g5p2x  于2021-12-30 转载在 Python  
字(16.6k)|赞(0)|评价(0)|浏览(242)

BST插值建树re-balance再平衡构建AVL(Adelson-Velskii & Landis)平衡二叉搜索树,基于networkx、binarytree,implement by Python

networkx提供了完善的节点和树的边线功能,但没有根据给定的值创建平衡AVL树的能力,借助于networkx构建BST二叉搜索树,在插入新值过程中,导致二叉树失衡,再平衡它。binarytree虽然有方便的树的节点打印管理和维护能力,但binarytree在BST失衡时候的再平衡过程中,binarytree的节点几乎不可能完成对树的再平衡形成AVL。所以基于networkx建树-平衡,然后把networkx的节点提取出来导入到binarytree再构建树,检测是否是平衡的AVL树。

  1. import random
  2. import binarytree
  3. from matplotlib import pyplot as plt
  4. import networkx as nx
  5. """
  6. BST二叉搜索树插值建树re-balance再平衡构建AVL(Adelson-Velskii & Landis)平衡二叉搜索树
  7. """
  8. LEFT = 'left'
  9. RIGHT = 'right'
  10. def app():
  11. SIZE = 20 # 测试数据数量
  12. data = []
  13. for i in range(SIZE):
  14. data.append(i)
  15. random.shuffle(data) # 随机打乱。
  16. print('data', data)
  17. G = nx.DiGraph()
  18. plt.figure(figsize=(10, 8), dpi=100)
  19. rows = 2
  20. cols = int(SIZE / 2) + 1
  21. index = 1
  22. while len(data) > 0:
  23. print('-----')
  24. d = data.pop(0)
  25. insert(G, d)
  26. unblance_node = check_blance(G, d)
  27. if unblance_node is not None:
  28. print('找到失衡点', unblance_node)
  29. print('失衡', 'nodes', G.nodes(data=True))
  30. if unblance_node[1] > 1:
  31. if get_blance_factor(G, unblance_node[0][1][LEFT]) < 0:
  32. # x x
  33. # / \ / \
  34. # y D z D
  35. # / \ -> / \
  36. # A z y C
  37. # / \ / \
  38. # B C A B
  39. rotate_left(G, unblance_node[0][1][LEFT])
  40. # x z
  41. # / \ / \
  42. # z D y x
  43. # / \ -> / \ / \
  44. # y C A B C D
  45. # / \
  46. # A B
  47. rotate_right(G, unblance_node[0][0])
  48. if unblance_node[1] < -1:
  49. if get_blance_factor(G, unblance_node[0][1][RIGHT]) > 0:
  50. # y y
  51. # / \ / \
  52. # A x A z
  53. # / \ -> / \
  54. # z D B x
  55. # / \ / \
  56. # B C C D
  57. rotate_right(G, unblance_node[0][1][RIGHT])
  58. # y z
  59. # / \ / \
  60. # A z y x
  61. # / \ -> / \ / \
  62. # B x A B C D
  63. # / \
  64. # C D
  65. rotate_left(G, unblance_node[0][0])
  66. pos = nx.shell_layout(G)
  67. plt.subplot(rows, cols, index)
  68. nx.draw(G, pos, node_color='red', node_size=300, font_size=10, font_color='green', with_labels=True)
  69. index = index + 1
  70. print('---')
  71. print('nodes', G.nodes(data=True))
  72. print('edges', G.edges(data=True))
  73. print('=====')
  74. # 借助另外一个Python库binarytree检查通过networkx构建的二叉搜索树是否平衡。双盲检查。
  75. bst_tree = build_bst_tree(G)
  76. print(bst_tree)
  77. print('是平衡的AVL树吗?', bst_tree.is_bst)
  78. plt.show()
  79. # 把networkx构建的树的节点转换,构建成binarytree的树。
  80. # 基于BFS广度遍历思想。
  81. def build_bst_tree(G):
  82. root_node = get_root_node(G)
  83. root = binarytree.Node(root_node[0])
  84. Q = [root]
  85. while True:
  86. node = Q.pop()
  87. l = get_node_by_value(G, node.value)[1][LEFT]
  88. r = get_node_by_value(G, node.value)[1][RIGHT]
  89. if l is not None:
  90. l_node = binarytree.Node(l)
  91. node.left = l_node
  92. Q.append(l_node)
  93. if r is not None:
  94. r_node = binarytree.Node(r)
  95. node.right = r_node
  96. Q.append(r_node)
  97. if len(Q) == 0:
  98. break
  99. return root
  100. # 获得networkx的根节点
  101. def get_root_node(G):
  102. node = None
  103. for n in G.nodes(data=True):
  104. predecessors = G.predecessors(n[0])
  105. if len(list(predecessors)) == 0:
  106. node = n
  107. break
  108. return node
  109. # 右旋
  110. def rotate_right(G, node_value):
  111. print('rotate_right', node_value)
  112. parent = get_parent(G, node_value)
  113. print(node_value, '父节点', parent)
  114. l_child = get_node_by_value(G, node_value)[1][LEFT]
  115. l_child_right = get_node_by_value(G, l_child)[1][RIGHT]
  116. if parent is not None:
  117. G.remove_edge(parent, node_value)
  118. if node_value > parent:
  119. G.nodes[parent][RIGHT] = None
  120. else:
  121. G.nodes[parent][LEFT] = None
  122. G.remove_edge(node_value, l_child)
  123. G.nodes[node_value][LEFT] = None
  124. if l_child_right is not None:
  125. G.remove_edge(l_child, l_child_right)
  126. G.nodes[l_child][RIGHT] = None
  127. G.add_edge(node_value, l_child_right)
  128. G.nodes[node_value][LEFT] = l_child_right
  129. G.add_edge(l_child, node_value)
  130. G.nodes[l_child][RIGHT] = node_value
  131. if parent is not None:
  132. G.add_edge(parent, l_child)
  133. if l_child > parent:
  134. G.nodes[parent][RIGHT] = l_child
  135. else:
  136. G.nodes[parent][LEFT] = l_child
  137. # 左旋
  138. def rotate_left(G, node_value):
  139. print('rotate_left', node_value)
  140. parent = get_parent(G, node_value)
  141. print(node_value, '父节点', parent)
  142. r_child = get_node_by_value(G, node_value)[1][RIGHT]
  143. r_child_left = get_node_by_value(G, r_child)[1][LEFT]
  144. if parent is not None:
  145. G.remove_edge(parent, node_value)
  146. if node_value > parent:
  147. G.nodes[parent][RIGHT] = None
  148. else:
  149. G.nodes[parent][LEFT] = None
  150. G.remove_edge(node_value, r_child)
  151. G.nodes[node_value][RIGHT] = None
  152. if r_child_left is not None:
  153. G.remove_edge(r_child, r_child_left)
  154. G.nodes[r_child][LEFT] = None
  155. G.add_edge(node_value, r_child_left)
  156. G.nodes[node_value][RIGHT] = r_child_left
  157. G.add_edge(r_child, node_value)
  158. G.nodes[r_child][LEFT] = node_value
  159. if parent is not None:
  160. G.add_edge(parent, r_child)
  161. if r_child > parent:
  162. G.nodes[parent][RIGHT] = r_child
  163. else:
  164. G.nodes[parent][LEFT] = r_child
  165. # 根据一个节点的值,获得该节点的父节点
  166. def get_parent(G, n):
  167. predecessors = G.predecessors(n)
  168. ps = list(predecessors)
  169. parent = None
  170. if len(ps) != 0:
  171. parent = ps.pop()
  172. return parent
  173. # 给定一个节点的值,检测距离该节点最近的失衡的点
  174. # 一般来说,当在树中插上一个新值后,导致树失衡,如果树很高时候,失衡点会很多,
  175. # 该函数搜索出距离插入点d最近的那个失衡点(距离d最近)
  176. def check_blance(G, d):
  177. unblance_nodes = []
  178. for n in G.nodes(data=True):
  179. f = get_blance_factor(G, n[0])
  180. if abs(f) > 1:
  181. node = (n, f)
  182. unblance_nodes.append(node)
  183. min_len = float('inf')
  184. node = None
  185. for n in unblance_nodes:
  186. lenght = nx.shortest_path_length(G, source=n[0][0], target=d)
  187. if lenght < min_len:
  188. min_len = lenght
  189. node = n
  190. return node
  191. # 获得该节点的平衡因子
  192. def get_blance_factor(G, number):
  193. factor = 0
  194. if get_node_height(G, number) == 0:
  195. factor = 0
  196. # print(number, '平衡因子', factor)
  197. return factor
  198. left = G.nodes[number][LEFT]
  199. right = G.nodes[number][RIGHT]
  200. lh = 0
  201. rh = 0
  202. if left is not None:
  203. lh = get_node_height(G, left) + 1
  204. if right is not None:
  205. rh = get_node_height(G, right) + 1
  206. factor = lh - rh
  207. # print(number, '平衡因子', factor)
  208. return factor
  209. # 给定一个节点的值,获得该节点的树高度
  210. def get_node_height(G, number):
  211. height = 0
  212. successors = G.successors(number)
  213. if len(list(successors)) == 0:
  214. height = 0
  215. # print(number, '高度', height)
  216. return height
  217. bfs = nx.bfs_tree(G, number)
  218. node_v = list(bfs).pop()
  219. # print(number, '最远的点', node_v)
  220. while True:
  221. predecessors = G.predecessors(node_v)
  222. ps = list(predecessors)
  223. # print(node_v, '前继', ps)
  224. if len(ps) == 0:
  225. break
  226. else:
  227. p_node_v = ps.pop()
  228. height = height + 1
  229. if p_node_v == number:
  230. break
  231. else:
  232. node_v = p_node_v
  233. # print(number, '高度', height)
  234. return height
  235. # 根据一个节点的值,获取该节点的完整节点信息
  236. def get_node_by_value(G, v):
  237. node = None
  238. for n in G.nodes(data=True):
  239. if n[0] == v:
  240. node = n
  241. break
  242. return node
  243. # 输入一个值,根据这个值构建节点,并插入到树中
  244. def insert(G, d):
  245. if G.number_of_nodes() == 0:
  246. G.add_node(d)
  247. G.nodes[d][RIGHT] = None
  248. G.nodes[d][LEFT] = None
  249. return
  250. print('开始插入', d)
  251. root_node = get_root_node(G)
  252. print('根节点', root_node)
  253. while True:
  254. left = root_node[1][LEFT]
  255. right = root_node[1][RIGHT]
  256. if right is None:
  257. if d > root_node[0]:
  258. root_node[1][RIGHT] = d
  259. G.add_node(d)
  260. G.nodes[d][LEFT] = None
  261. G.nodes[d][RIGHT] = None
  262. G.add_edge(root_node[0], d)
  263. break
  264. if left is None:
  265. if d < root_node[0]:
  266. root_node[1][LEFT] = d
  267. G.add_node(d)
  268. G.nodes[d][LEFT] = None
  269. G.nodes[d][RIGHT] = None
  270. G.add_edge(root_node[0], d)
  271. break
  272. if d > root_node[0]:
  273. val = root_node[1][RIGHT]
  274. root_node = get_node_by_value(G, val)
  275. else:
  276. val = root_node[1][LEFT]
  277. root_node = get_node_by_value(G, val)
  278. if __name__ == '__main__':
  279. app()

运行日志输出:

  1. data [10, 7, 16, 17, 1, 0, 6, 15, 3, 12, 18, 14, 2, 5, 19, 8, 13, 11, 9, 4]
  2. -----
  3. -----
  4. 开始插入 7
  5. 根节点 (10, {'right': None, 'left': None})
  6. -----
  7. 开始插入 16
  8. 根节点 (10, {'right': None, 'left': 7})
  9. -----
  10. 开始插入 17
  11. 根节点 (10, {'right': 16, 'left': 7})
  12. -----
  13. 开始插入 1
  14. 根节点 (10, {'right': 16, 'left': 7})
  15. -----
  16. 开始插入 0
  17. 根节点 (10, {'right': 16, 'left': 7})
  18. 找到失衡点 ((7, {'left': 1, 'right': None}), 2)
  19. 失衡 nodes [(10, {'right': 16, 'left': 7}), (7, {'left': 1, 'right': None}), (16, {'left': None, 'right': 17}), (17, {'left': None, 'right': None}), (1, {'left': 0, 'right': None}), (0, {'left': None, 'right': None})]
  20. rotate_right 7
  21. 7 父节点 10
  22. -----
  23. 开始插入 6
  24. 根节点 (10, {'right': 16, 'left': 1})
  25. -----
  26. 开始插入 15
  27. 根节点 (10, {'right': 16, 'left': 1})
  28. -----
  29. 开始插入 3
  30. 根节点 (10, {'right': 16, 'left': 1})
  31. 找到失衡点 ((7, {'left': 6, 'right': None}), 2)
  32. 失衡 nodes [(10, {'right': 16, 'left': 1}), (7, {'left': 6, 'right': None}), (16, {'left': 15, 'right': 17}), (17, {'left': None, 'right': None}), (1, {'left': 0, 'right': 7}), (0, {'left': None, 'right': None}), (6, {'left': 3, 'right': None}), (15, {'left': None, 'right': None}), (3, {'left': None, 'right': None})]
  33. rotate_right 7
  34. 7 父节点 1
  35. -----
  36. 开始插入 12
  37. 根节点 (10, {'right': 16, 'left': 1})
  38. -----
  39. 开始插入 18
  40. 根节点 (10, {'right': 16, 'left': 1})
  41. -----
  42. 开始插入 14
  43. 根节点 (10, {'right': 16, 'left': 1})
  44. 找到失衡点 ((15, {'left': 12, 'right': None}), 2)
  45. 失衡 nodes [(10, {'right': 16, 'left': 1}), (7, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (17, {'left': None, 'right': 18}), (1, {'left': 0, 'right': 6}), (0, {'left': None, 'right': None}), (6, {'left': 3, 'right': 7}), (15, {'left': 12, 'right': None}), (3, {'left': None, 'right': None}), (12, {'left': None, 'right': 14}), (18, {'left': None, 'right': None}), (14, {'left': None, 'right': None})]
  46. rotate_left 12
  47. 12 父节点 15
  48. rotate_right 15
  49. 15 父节点 16
  50. -----
  51. 开始插入 2
  52. 根节点 (10, {'right': 16, 'left': 1})
  53. 找到失衡点 ((1, {'left': 0, 'right': 6}), -2)
  54. 失衡 nodes [(10, {'right': 16, 'left': 1}), (7, {'left': None, 'right': None}), (16, {'left': 14, 'right': 17}), (17, {'left': None, 'right': 18}), (1, {'left': 0, 'right': 6}), (0, {'left': None, 'right': None}), (6, {'left': 3, 'right': 7}), (15, {'left': None, 'right': None}), (3, {'left': 2, 'right': None}), (12, {'left': None, 'right': None}), (18, {'left': None, 'right': None}), (14, {'left': 12, 'right': 15}), (2, {'left': None, 'right': None})]
  55. rotate_right 6
  56. 6 父节点 1
  57. rotate_left 1
  58. 1 父节点 10
  59. -----
  60. 开始插入 5
  61. 根节点 (10, {'right': 16, 'left': 3})
  62. -----
  63. 开始插入 19
  64. 根节点 (10, {'right': 16, 'left': 3})
  65. 找到失衡点 ((17, {'left': None, 'right': 18}), -2)
  66. 失衡 nodes [(10, {'right': 16, 'left': 3}), (7, {'left': None, 'right': None}), (16, {'left': 14, 'right': 17}), (17, {'left': None, 'right': 18}), (1, {'left': 0, 'right': 2}), (0, {'left': None, 'right': None}), (6, {'left': 5, 'right': 7}), (15, {'left': None, 'right': None}), (3, {'left': 1, 'right': 6}), (12, {'left': None, 'right': None}), (18, {'left': None, 'right': 19}), (14, {'left': 12, 'right': 15}), (2, {'left': None, 'right': None}), (5, {'left': None, 'right': None}), (19, {'left': None, 'right': None})]
  67. rotate_left 17
  68. 17 父节点 16
  69. -----
  70. 开始插入 8
  71. 根节点 (10, {'right': 16, 'left': 3})
  72. -----
  73. 开始插入 13
  74. 根节点 (10, {'right': 16, 'left': 3})
  75. -----
  76. 开始插入 11
  77. 根节点 (10, {'right': 16, 'left': 3})
  78. -----
  79. 开始插入 9
  80. 根节点 (10, {'right': 16, 'left': 3})
  81. 找到失衡点 ((7, {'left': None, 'right': 8}), -2)
  82. 失衡 nodes [(10, {'right': 16, 'left': 3}), (7, {'left': None, 'right': 8}), (16, {'left': 14, 'right': 18}), (17, {'left': None, 'right': None}), (1, {'left': 0, 'right': 2}), (0, {'left': None, 'right': None}), (6, {'left': 5, 'right': 7}), (15, {'left': None, 'right': None}), (3, {'left': 1, 'right': 6}), (12, {'left': 11, 'right': 13}), (18, {'left': 17, 'right': 19}), (14, {'left': 12, 'right': 15}), (2, {'left': None, 'right': None}), (5, {'left': None, 'right': None}), (19, {'left': None, 'right': None}), (8, {'left': None, 'right': 9}), (13, {'left': None, 'right': None}), (11, {'left': None, 'right': None}), (9, {'left': None, 'right': None})]
  83. rotate_left 7
  84. 7 父节点 6
  85. -----
  86. 开始插入 4
  87. 根节点 (10, {'right': 16, 'left': 3})
  88. ---
  89. nodes [(10, {'right': 16, 'left': 3}), (7, {'left': None, 'right': None}), (16, {'left': 14, 'right': 18}), (17, {'left': None, 'right': None}), (1, {'left': 0, 'right': 2}), (0, {'left': None, 'right': None}), (6, {'left': 5, 'right': 8}), (15, {'left': None, 'right': None}), (3, {'left': 1, 'right': 6}), (12, {'left': 11, 'right': 13}), (18, {'left': 17, 'right': 19}), (14, {'left': 12, 'right': 15}), (2, {'left': None, 'right': None}), (5, {'left': 4, 'right': None}), (19, {'left': None, 'right': None}), (8, {'left': 7, 'right': 9}), (13, {'left': None, 'right': None}), (11, {'left': None, 'right': None}), (9, {'left': None, 'right': None}), (4, {'left': None, 'right': None})]
  90. edges [(10, 16, {}), (10, 3, {}), (16, 14, {}), (16, 18, {}), (1, 0, {}), (1, 2, {}), (6, 5, {}), (6, 8, {}), (3, 6, {}), (3, 1, {}), (12, 13, {}), (12, 11, {}), (18, 19, {}), (18, 17, {}), (14, 12, {}), (14, 15, {}), (5, 4, {}), (8, 9, {}), (8, 7, {})]
  91. =====
  92. ____________10_______________
  93. / \
  94. __3____ ____16___
  95. / \ / \
  96. 1 6__ ____14 _18
  97. / \ / \ / \ / \
  98. 0 2 5 8 _12 15 17 19
  99. / / \ / \
  100. 4 7 9 11 13
  101. 是平衡的AVL树吗? True

再跑一轮测试:

  1. data [18, 14, 10, 5, 15, 9, 19, 1, 2, 11, 17, 16, 8, 6, 4, 0, 12, 7, 13, 3]
  2. -----
  3. -----
  4. 开始插入 14
  5. 根节点 (18, {'right': None, 'left': None})
  6. -----
  7. 开始插入 10
  8. 根节点 (18, {'right': None, 'left': 14})
  9. 找到失衡点 ((18, {'right': None, 'left': 14}), 2)
  10. 失衡 nodes [(18, {'right': None, 'left': 14}), (14, {'left': 10, 'right': None}), (10, {'left': None, 'right': None})]
  11. rotate_right 18
  12. 18 父节点 None
  13. -----
  14. 开始插入 5
  15. 根节点 (14, {'left': 10, 'right': 18})
  16. -----
  17. 开始插入 15
  18. 根节点 (14, {'left': 10, 'right': 18})
  19. -----
  20. 开始插入 9
  21. 根节点 (14, {'left': 10, 'right': 18})
  22. 找到失衡点 ((10, {'left': 5, 'right': None}), 2)
  23. 失衡 nodes [(18, {'right': None, 'left': 15}), (14, {'left': 10, 'right': 18}), (10, {'left': 5, 'right': None}), (5, {'left': None, 'right': 9}), (15, {'left': None, 'right': None}), (9, {'left': None, 'right': None})]
  24. rotate_left 5
  25. 5 父节点 10
  26. rotate_right 10
  27. 10 父节点 14
  28. -----
  29. 开始插入 19
  30. 根节点 (14, {'left': 9, 'right': 18})
  31. -----
  32. 开始插入 1
  33. 根节点 (14, {'left': 9, 'right': 18})
  34. -----
  35. 开始插入 2
  36. 根节点 (14, {'left': 9, 'right': 18})
  37. 找到失衡点 ((5, {'left': 1, 'right': None}), 2)
  38. 失衡 nodes [(18, {'right': 19, 'left': 15}), (14, {'left': 9, 'right': 18}), (10, {'left': None, 'right': None}), (5, {'left': 1, 'right': None}), (15, {'left': None, 'right': None}), (9, {'left': 5, 'right': 10}), (19, {'left': None, 'right': None}), (1, {'left': None, 'right': 2}), (2, {'left': None, 'right': None})]
  39. rotate_left 1
  40. 1 父节点 5
  41. rotate_right 5
  42. 5 父节点 9
  43. -----
  44. 开始插入 11
  45. 根节点 (14, {'left': 9, 'right': 18})
  46. -----
  47. 开始插入 17
  48. 根节点 (14, {'left': 9, 'right': 18})
  49. -----
  50. 开始插入 16
  51. 根节点 (14, {'left': 9, 'right': 18})
  52. 找到失衡点 ((15, {'left': None, 'right': 17}), -2)
  53. 失衡 nodes [(18, {'right': 19, 'left': 15}), (14, {'left': 9, 'right': 18}), (10, {'left': None, 'right': 11}), (5, {'left': None, 'right': None}), (15, {'left': None, 'right': 17}), (9, {'left': 2, 'right': 10}), (19, {'left': None, 'right': None}), (1, {'left': None, 'right': None}), (2, {'left': 1, 'right': 5}), (11, {'left': None, 'right': None}), (17, {'left': 16, 'right': None}), (16, {'left': None, 'right': None})]
  54. rotate_right 17
  55. 17 父节点 15
  56. rotate_left 15
  57. 15 父节点 18
  58. -----
  59. 开始插入 8
  60. 根节点 (14, {'left': 9, 'right': 18})
  61. -----
  62. 开始插入 6
  63. 根节点 (14, {'left': 9, 'right': 18})
  64. 找到失衡点 ((5, {'left': None, 'right': 8}), -2)
  65. 失衡 nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 9, 'right': 18}), (10, {'left': None, 'right': 11}), (5, {'left': None, 'right': 8}), (15, {'left': None, 'right': None}), (9, {'left': 2, 'right': 10}), (19, {'left': None, 'right': None}), (1, {'left': None, 'right': None}), (2, {'left': 1, 'right': 5}), (11, {'left': None, 'right': None}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': 6, 'right': None}), (6, {'left': None, 'right': None})]
  66. rotate_right 8
  67. 8 父节点 5
  68. rotate_left 5
  69. 5 父节点 2
  70. -----
  71. 开始插入 4
  72. 根节点 (14, {'left': 9, 'right': 18})
  73. 找到失衡点 ((2, {'left': 1, 'right': 6}), -2)
  74. 失衡 nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 9, 'right': 18}), (10, {'left': None, 'right': 11}), (5, {'left': 4, 'right': None}), (15, {'left': None, 'right': None}), (9, {'left': 2, 'right': 10}), (19, {'left': None, 'right': None}), (1, {'left': None, 'right': None}), (2, {'left': 1, 'right': 6}), (11, {'left': None, 'right': None}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': None, 'right': None}), (6, {'left': 5, 'right': 8}), (4, {'left': None, 'right': None})]
  75. rotate_right 6
  76. 6 父节点 2
  77. rotate_left 2
  78. 2 父节点 9
  79. -----
  80. 开始插入 0
  81. 根节点 (14, {'left': 9, 'right': 18})
  82. 找到失衡点 ((9, {'left': 5, 'right': 10}), 2)
  83. 失衡 nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 9, 'right': 18}), (10, {'left': None, 'right': 11}), (5, {'left': 2, 'right': 6}), (15, {'left': None, 'right': None}), (9, {'left': 5, 'right': 10}), (19, {'left': None, 'right': None}), (1, {'left': 0, 'right': None}), (2, {'left': 1, 'right': 4}), (11, {'left': None, 'right': None}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': None, 'right': None}), (6, {'left': None, 'right': 8}), (4, {'left': None, 'right': None}), (0, {'left': None, 'right': None})]
  84. rotate_right 9
  85. 9 父节点 14
  86. -----
  87. 开始插入 12
  88. 根节点 (14, {'left': 5, 'right': 18})
  89. 找到失衡点 ((10, {'left': None, 'right': 11}), -2)
  90. 失衡 nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 5, 'right': 18}), (10, {'left': None, 'right': 11}), (5, {'left': 2, 'right': 9}), (15, {'left': None, 'right': None}), (9, {'left': 6, 'right': 10}), (19, {'left': None, 'right': None}), (1, {'left': 0, 'right': None}), (2, {'left': 1, 'right': 4}), (11, {'left': None, 'right': 12}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': None, 'right': None}), (6, {'left': None, 'right': 8}), (4, {'left': None, 'right': None}), (0, {'left': None, 'right': None}), (12, {'left': None, 'right': None})]
  91. rotate_left 10
  92. 10 父节点 9
  93. -----
  94. 开始插入 7
  95. 根节点 (14, {'left': 5, 'right': 18})
  96. 找到失衡点 ((6, {'left': None, 'right': 8}), -2)
  97. 失衡 nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 5, 'right': 18}), (10, {'left': None, 'right': None}), (5, {'left': 2, 'right': 9}), (15, {'left': None, 'right': None}), (9, {'left': 6, 'right': 11}), (19, {'left': None, 'right': None}), (1, {'left': 0, 'right': None}), (2, {'left': 1, 'right': 4}), (11, {'left': 10, 'right': 12}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': 7, 'right': None}), (6, {'left': None, 'right': 8}), (4, {'left': None, 'right': None}), (0, {'left': None, 'right': None}), (12, {'left': None, 'right': None}), (7, {'left': None, 'right': None})]
  98. rotate_right 8
  99. 8 父节点 6
  100. rotate_left 6
  101. 6 父节点 9
  102. -----
  103. 开始插入 13
  104. 根节点 (14, {'left': 5, 'right': 18})
  105. 找到失衡点 ((14, {'left': 5, 'right': 18}), 2)
  106. 失衡 nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 5, 'right': 18}), (10, {'left': None, 'right': None}), (5, {'left': 2, 'right': 9}), (15, {'left': None, 'right': None}), (9, {'left': 7, 'right': 11}), (19, {'left': None, 'right': None}), (1, {'left': 0, 'right': None}), (2, {'left': 1, 'right': 4}), (11, {'left': 10, 'right': 12}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': None, 'right': None}), (6, {'left': None, 'right': None}), (4, {'left': None, 'right': None}), (0, {'left': None, 'right': None}), (12, {'left': None, 'right': 13}), (7, {'left': 6, 'right': 8}), (13, {'left': None, 'right': None})]
  107. rotate_left 5
  108. 5 父节点 14
  109. rotate_right 14
  110. 14 父节点 None
  111. -----
  112. 开始插入 3
  113. 根节点 (9, {'left': 5, 'right': 14})
  114. ---
  115. nodes [(18, {'right': 19, 'left': 16}), (14, {'left': 11, 'right': 18}), (10, {'left': None, 'right': None}), (5, {'left': 2, 'right': 7}), (15, {'left': None, 'right': None}), (9, {'left': 5, 'right': 14}), (19, {'left': None, 'right': None}), (1, {'left': 0, 'right': None}), (2, {'left': 1, 'right': 4}), (11, {'left': 10, 'right': 12}), (17, {'left': None, 'right': None}), (16, {'left': 15, 'right': 17}), (8, {'left': None, 'right': None}), (6, {'left': None, 'right': None}), (4, {'left': 3, 'right': None}), (0, {'left': None, 'right': None}), (12, {'left': None, 'right': 13}), (7, {'left': 6, 'right': 8}), (13, {'left': None, 'right': None}), (3, {'left': None, 'right': None})]
  116. edges [(18, 19, {}), (18, 16, {}), (14, 18, {}), (14, 11, {}), (5, 2, {}), (5, 7, {}), (9, 5, {}), (9, 14, {}), (1, 0, {}), (2, 1, {}), (2, 4, {}), (11, 12, {}), (11, 10, {}), (16, 17, {}), (16, 15, {}), (4, 3, {}), (12, 13, {}), (7, 8, {}), (7, 6, {})]
  117. =====
  118. ______9____________
  119. / \
  120. ____5__ _______14_________
  121. / \ / \
  122. 2__ 7 _11 ____18
  123. / \ / \ / \ / \
  124. 1 4 6 8 10 12 _16 19
  125. / / \ / \
  126. 0 3 13 15 17
  127. 是平衡的AVL树吗? True

相关文章