BST二叉搜索树插入节点建树并找出不平衡节点,networkx,Python

x33g5p2x  于2021-12-01 转载在 Python  
字(2.7k)|赞(0)|评价(0)|浏览(392)

BST二叉搜索树插入节点建树并找出失衡节点,networkx,Python

  1. import random
  2. from matplotlib import pyplot as plt
  3. import networkx as nx
  4. PARENT = 'parent'
  5. LEFT = 'left'
  6. RIGHT = 'right'
  7. def app():
  8. SIZE = 5
  9. data = []
  10. for i in range(SIZE):
  11. data.append(i)
  12. random.shuffle(data)
  13. G = nx.DiGraph()
  14. while len(data) > 0:
  15. print('-')
  16. d = data.pop()
  17. insert(G, d)
  18. unblance_node = check_blance(G)
  19. if unblance_node is not None:
  20. print('找到失衡点', unblance_node)
  21. print(G.nodes(data=True))
  22. pos = nx.spring_layout(G)
  23. nx.draw(G, pos,
  24. node_color='red',
  25. node_size=300,
  26. font_size=10,
  27. font_color='green',
  28. with_labels=True)
  29. plt.show()
  30. def check_blance(G):
  31. node = None
  32. for n in G.nodes(data=True):
  33. f = get_blance_factor(G, n[0])
  34. if abs(f) > 1:
  35. node = (n, f)
  36. return node
  37. def get_blance_factor(G, number):
  38. factor = 0
  39. if get_node_height(G, number) == 0:
  40. factor = 0
  41. # print(number, '平衡因子', factor)
  42. return factor
  43. left = G.nodes[number][LEFT]
  44. right = G.nodes[number][RIGHT]
  45. lh = 0
  46. rh = 0
  47. if left is not None:
  48. lh = get_node_height(G, left) + 1
  49. if right is not None:
  50. rh = get_node_height(G, right) + 1
  51. factor = lh - rh
  52. # print(number, '平衡因子', factor)
  53. return factor
  54. def get_node_height(G, number):
  55. height = 0
  56. node = get_node_by_value(G, number)
  57. if node[1][LEFT] is None and node[1][RIGHT] is None:
  58. # print(number, '高度', height)
  59. return height
  60. bfs = nx.bfs_tree(G, source=number)
  61. last = list(bfs).pop()
  62. while True:
  63. last_n = get_node_by_value(G, last)
  64. if last_n[1][PARENT] is None:
  65. break
  66. else:
  67. height = height + 1
  68. last = last_n[1][PARENT]
  69. if last == number:
  70. break
  71. # print(number, '高度', height)
  72. return height
  73. def get_node_by_value(G, v):
  74. node = None
  75. for n in G.nodes(data=True):
  76. if n[0] == v:
  77. node = n
  78. break
  79. return node
  80. def insert(G, d):
  81. if G.number_of_nodes() == 0:
  82. G.add_node(d)
  83. G.nodes[d][PARENT] = None
  84. G.nodes[d][LEFT] = None
  85. G.nodes[d][RIGHT] = None
  86. return
  87. print('开始插入', d)
  88. root_node = None
  89. for n in G.nodes(data=True):
  90. if n[1][PARENT] is None:
  91. root_node = n
  92. break
  93. print('根节点', root_node)
  94. while True:
  95. left = root_node[1][LEFT]
  96. right = root_node[1][RIGHT]
  97. if left is None:
  98. if d < root_node[0]:
  99. root_node[1][LEFT] = d
  100. G.add_node(d)
  101. G.nodes[d][PARENT] = root_node[0]
  102. G.nodes[d][LEFT] = None
  103. G.nodes[d][RIGHT] = None
  104. G.add_edge(root_node[0], d)
  105. break
  106. if right is None:
  107. if d > root_node[0]:
  108. root_node[1][RIGHT] = d
  109. G.add_node(d)
  110. G.nodes[d][PARENT] = root_node[0]
  111. G.nodes[d][LEFT] = None
  112. G.nodes[d][RIGHT] = None
  113. G.add_edge(root_node[0], d)
  114. break
  115. if d > root_node[0]:
  116. val = root_node[1][RIGHT]
  117. root_node = get_node_by_value(G, val)
  118. else:
  119. val = root_node[1][LEFT]
  120. root_node = get_node_by_value(G, val)
  121. if __name__ == '__main__':
  122. app()

输出:

  1. -
  2. -
  3. 开始插入 4
  4. 根节点 (3, {'parent': None, 'left': None, 'right': None})
  5. -
  6. 开始插入 2
  7. 根节点 (3, {'parent': None, 'left': None, 'right': 4})
  8. -
  9. 开始插入 0
  10. 根节点 (3, {'parent': None, 'left': 2, 'right': 4})
  11. -
  12. 开始插入 1
  13. 根节点 (3, {'parent': None, 'left': 2, 'right': 4})
  14. 找到失衡点 ((2, {'parent': 3, 'left': 0, 'right': None}), 2)
  15. [(3, {'parent': None, 'left': 2, 'right': 4}), (4, {'parent': 3, 'left': None, 'right': None}), (2, {'parent': 3, 'left': 0, 'right': None}), (0, {'parent': 2, 'left': None, 'right': 1}), (1, {'parent': 0, 'left': None, 'right': None})]

相关文章