networkx构建BST二叉搜索树,Python

x33g5p2x  于2021-12-05 转载在 Python  
字(2.1k)|赞(0)|评价(0)|浏览(313)

networkx构建BST二叉搜索树,Python

  1. import random
  2. from matplotlib import pyplot as plt
  3. import networkx as nx
  4. LEFT = 'left'
  5. RIGHT = 'right'
  6. def app():
  7. SIZE = 10
  8. data = []
  9. for i in range(SIZE):
  10. data.append(i)
  11. random.shuffle(data)
  12. # data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  13. print('data', data)
  14. G = nx.DiGraph()
  15. while len(data) > 0:
  16. print('-----')
  17. d = data.pop()
  18. insert(G, d)
  19. print(G.nodes(data=True))
  20. print(G.edges(data=True))
  21. pos = nx.spiral_layout(G)
  22. nx.draw(G, pos,
  23. node_color='red',
  24. node_size=300,
  25. font_size=10,
  26. font_color='green',
  27. with_labels=True)
  28. plt.show()
  29. def get_node_by_value(G, v):
  30. node = None
  31. for n in G.nodes(data=True):
  32. if n[0] == v:
  33. node = n
  34. break
  35. return node
  36. def get_root_node(G):
  37. node = None
  38. for n in G.nodes(data=True):
  39. predecessors = G.predecessors(n[0])
  40. if len(list(predecessors)) == 0:
  41. node = n
  42. break
  43. return node
  44. def insert(G, d):
  45. if G.number_of_nodes() == 0:
  46. G.add_node(d)
  47. G.nodes[d][RIGHT] = None
  48. G.nodes[d][LEFT] = None
  49. return
  50. print('开始插入', d)
  51. root_node = get_root_node(G)
  52. print('根节点', root_node)
  53. while True:
  54. left = root_node[1][LEFT]
  55. right = root_node[1][RIGHT]
  56. if right is None:
  57. if d > root_node[0]:
  58. root_node[1][RIGHT] = d
  59. G.add_node(d)
  60. G.nodes[d][LEFT] = None
  61. G.nodes[d][RIGHT] = None
  62. G.add_edge(root_node[0], d)
  63. break
  64. if left is None:
  65. if d < root_node[0]:
  66. root_node[1][LEFT] = d
  67. G.add_node(d)
  68. G.nodes[d][LEFT] = None
  69. G.nodes[d][RIGHT] = None
  70. G.add_edge(root_node[0], d)
  71. break
  72. if d > root_node[0]:
  73. val = root_node[1][RIGHT]
  74. root_node = get_node_by_value(G, val)
  75. else:
  76. val = root_node[1][LEFT]
  77. root_node = get_node_by_value(G, val)
  78. if __name__ == '__main__':
  79. app()

输出:

  1. data [3, 5, 9, 2, 1, 6, 7, 0, 8, 4]
  2. -----
  3. -----
  4. 开始插入 8
  5. 根节点 (4, {'right': None, 'left': None})
  6. -----
  7. 开始插入 0
  8. 根节点 (4, {'right': 8, 'left': None})
  9. -----
  10. 开始插入 7
  11. 根节点 (4, {'right': 8, 'left': 0})
  12. -----
  13. 开始插入 6
  14. 根节点 (4, {'right': 8, 'left': 0})
  15. -----
  16. 开始插入 1
  17. 根节点 (4, {'right': 8, 'left': 0})
  18. -----
  19. 开始插入 2
  20. 根节点 (4, {'right': 8, 'left': 0})
  21. -----
  22. 开始插入 9
  23. 根节点 (4, {'right': 8, 'left': 0})
  24. -----
  25. 开始插入 5
  26. 根节点 (4, {'right': 8, 'left': 0})
  27. -----
  28. 开始插入 3
  29. 根节点 (4, {'right': 8, 'left': 0})
  30. [(4, {'right': 8, 'left': 0}), (8, {'left': 7, 'right': 9}), (0, {'left': None, 'right': 1}), (7, {'left': 6, 'right': None}), (6, {'left': 5, 'right': None}), (1, {'left': None, 'right': 2}), (2, {'left': None, 'right': 3}), (9, {'left': None, 'right': None}), (5, {'left': None, 'right': None}), (3, {'left': None, 'right': None})]
  31. [(4, 8, {}), (4, 0, {}), (8, 7, {}), (8, 9, {}), (0, 1, {}), (7, 6, {}), (6, 5, {}), (1, 2, {}), (2, 3, {})]

相关文章