把一个无序的binarytree二叉树堆调整成一个标准大顶堆,非递归,python

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

把一个无序的binarytree二叉树堆调整成一个标准大顶堆,非递归,python

  1. import random
  2. from binarytree import build
  3. def app():
  4. data = []
  5. SIZE = 10
  6. for i in range(SIZE):
  7. data.append(i)
  8. # 随机打乱数据
  9. random.shuffle(data)
  10. my_tree = build(data)
  11. print('原二叉树堆:', my_tree)
  12. print('是大顶堆吗?', my_tree.is_max_heap)
  13. nodes = my_tree.levelorder
  14. print(nodes)
  15. print('-----')
  16. while True:
  17. ok = check(my_tree)
  18. if ok:
  19. print('调整二叉树堆完成')
  20. break
  21. adjust(my_tree)
  22. print(my_tree)
  23. print(my_tree.levelorder)
  24. print('是大顶堆吗?', my_tree.is_max_heap)
  25. """
  26. 如果已经是标准的大顶堆,那么数组中存储的数据,必然符合以下规律:
  27. array[i]>array[2*i+1] 并且 array[i]>array[2*i+2] , 即根节点大于任何子节点
  28. 如果不符合上述判断条件,那么该数组还不是大顶堆,需要继续调整。
  29. 注意,i的区间是0到array.size/2 - 1
  30. 在循环检测时候,小心数组越界情况。
  31. """
  32. def check(my_tree):
  33. val = my_tree.values
  34. flag = True
  35. for i in range(int(my_tree.size / 2)):
  36. i1 = 2 * i + 1
  37. i2 = 2 * i + 2
  38. if i1 < my_tree.size:
  39. if val[i] > val[i1]:
  40. flag = True
  41. else:
  42. flag = False
  43. break
  44. if i2 < my_tree.size:
  45. if val[i] > val[i2]:
  46. flag = True
  47. else:
  48. flag = False
  49. break
  50. return flag
  51. # 对无序的二叉树堆进行调整,把二叉树堆调整成一个大顶堆。
  52. def adjust(my_tree):
  53. idx = int(my_tree.size / 2) - 1
  54. nodes = my_tree.levelorder
  55. while idx >= 0:
  56. i1 = 2 * idx + 1
  57. i2 = 2 * idx + 2
  58. if i1 < my_tree.size:
  59. if nodes[i1].value > nodes[idx].value:
  60. swap(nodes[idx], nodes[i1])
  61. if i2 < my_tree.size:
  62. if nodes[i2].value > nodes[idx].value:
  63. swap(nodes[idx], nodes[i2])
  64. idx = idx - 1
  65. # 交换节点的值
  66. def swap(a, b):
  67. t = a.value
  68. a.value = b.value
  69. b.value = t
  70. if __name__ == '__main__':
  71. app()

输出:

  1. 原二叉树堆:
  2. ____7__
  3. / \
  4. __6__ 5
  5. / \ / \
  6. 3 0 2 1
  7. / \ /
  8. 9 4 8
  9. 是大顶堆吗? False
  10. [Node(7), Node(6), Node(5), Node(3), Node(0), Node(2), Node(1), Node(9), Node(4), Node(8)]
  11. -----
  12. 调整二叉树堆完成
  13. ____9__
  14. / \
  15. __8__ 5
  16. / \ / \
  17. 6 7 2 1
  18. / \ /
  19. 3 4 0
  20. [Node(9), Node(8), Node(5), Node(6), Node(7), Node(2), Node(1), Node(3), Node(4), Node(0)]
  21. 是大顶堆吗? True

相关文章