完全二叉树小顶堆插入和删除节点,非递归,binarytree,Python

x33g5p2x  于2021-11-23 转载在 Python  
字(1.2k)|赞(0)|评价(0)|浏览(327)

完全二叉树小顶堆插入和删除节点,非递归,binarytree,Python

  1. import binarytree
  2. from binarytree import heap, get_parent
  3. def app():
  4. # 构建一个小顶堆
  5. hp = heap(height=3, is_max=False, is_perfect=False)
  6. print(hp)
  7. print('-')
  8. # 在堆中插入一个节点
  9. values = hp.values
  10. values.append(99999)
  11. hp = binarytree.build(values)
  12. while not ok(hp):
  13. adjust(hp)
  14. print(hp)
  15. print('是小顶堆吗?', hp.is_min_heap)
  16. print('--')
  17. # 在堆中删除顶点(最小值)
  18. values = hp.values
  19. del (values[0])
  20. hp = binarytree.build(values)
  21. while not ok(hp):
  22. adjust(hp)
  23. print(hp)
  24. print('是小顶堆吗?', hp.is_min_heap)
  25. def adjust(my_tree):
  26. nodes = my_tree.levelorder
  27. while len(nodes) != 0:
  28. node = nodes.pop()
  29. p = get_parent(my_tree, node)
  30. left = node.left
  31. right = node.right
  32. if left is not None:
  33. if left.value < node.value:
  34. swap(left, node)
  35. if right is not None:
  36. if right.value < node.value:
  37. swap(right, node)
  38. if p is not None:
  39. if node.value < p.value:
  40. swap(node, p)
  41. def ok(my_tree):
  42. nodes = my_tree.levelorder
  43. done = True
  44. while len(nodes) != 0:
  45. p = nodes.pop()
  46. left = p.left
  47. right = p.right
  48. if left is not None:
  49. if p.value > left.value:
  50. done = False
  51. break
  52. if right is not None:
  53. if p.value > right.value:
  54. done = False
  55. break
  56. return done
  57. # 交换节点的值
  58. def swap(a, b):
  59. t = a.value
  60. a.value = b.value
  61. b.value = t
  62. if __name__ == '__main__':
  63. app()

输出:

  1. _____0__
  2. / \
  3. __1___ 2
  4. / \ / \
  5. 4 _8 6 12
  6. / \ /
  7. 7 9 13
  8. -
  9. ___________0__
  10. / \
  11. __1___ 2
  12. / \ / \
  13. 4 _8__ 6 12
  14. / \ / \
  15. 7 9 13 99999
  16. 是小顶堆吗? True
  17. --
  18. ________1___
  19. / \
  20. ___2______ _4
  21. / \ / \
  22. 8 __6 12 7
  23. / \ /
  24. 9 13 99999
  25. 是小顶堆吗? True

相关文章