无序binarytree二叉树堆调整成小顶堆,基于节点图,非数组内操作,非递归,python

x33g5p2x  于2021-11-18 转载在 Python  
字(1.0k)|赞(0)|评价(0)|浏览(351)

直接使用图中的节点父子关系循环遍历,不像之前那样在数组内操作排序。

  1. import random
  2. from binarytree import build, get_parent
  3. def app():
  4. data = []
  5. SIZE = 10
  6. for i in range(SIZE):
  7. data.append(i)
  8. random.shuffle(data)
  9. my_tree = build(data)
  10. print(my_tree)
  11. print('是小顶堆吗?', my_tree.is_min_heap)
  12. print('-----')
  13. while not ok(my_tree):
  14. adjust(my_tree)
  15. print(my_tree)
  16. print('是小顶堆吗?', my_tree.is_min_heap)
  17. def adjust(my_tree):
  18. nodes = my_tree.levelorder
  19. while len(nodes) != 0:
  20. node = nodes.pop()
  21. p = get_parent(my_tree, node)
  22. left = node.left
  23. right = node.right
  24. if left is not None:
  25. if left.value < node.value:
  26. swap(left, node)
  27. if right is not None:
  28. if right.value < node.value:
  29. swap(right, node)
  30. if p is not None:
  31. if node.value < p.value:
  32. swap(node, p)
  33. def ok(my_tree):
  34. nodes = my_tree.levelorder
  35. done = True
  36. while len(nodes) != 0:
  37. p = nodes.pop()
  38. left = p.left
  39. right = p.right
  40. if left is not None:
  41. if p.value > left.value:
  42. done = False
  43. break
  44. if right is not None:
  45. if p.value > right.value:
  46. done = False
  47. break
  48. return done
  49. # 交换节点的值
  50. def swap(a, b):
  51. t = a.value
  52. a.value = b.value
  53. b.value = t
  54. if __name__ == '__main__':
  55. app()

输出:

  1. ____4__
  2. / \
  3. __0__ 1
  4. / \ / \
  5. 8 6 5 9
  6. / \ /
  7. 7 2 3
  8. 是小顶堆吗? False
  9. -----
  10. ____0__
  11. / \
  12. __1__ 4
  13. / \ / \
  14. 2 3 5 9
  15. / \ /
  16. 7 8 6
  17. 是小顶堆吗? True

相关文章