当前位置:   article > 正文

python数据结构(二叉排序树)_python如何构建二叉排序树

python如何构建二叉排序树

目录

二叉排序树

二叉排序树查找

二叉排序树插入

二叉排序树删除

被删除的结点是叶子结点

被删除的结点只有左子树或只有右子树

被删除的结点既有左子树,也有右子树

平衡二叉树


二叉排序树

又称二叉查找树或者二叉排序树。

二叉排序树的形态完全由一个输入序列决定。

特征:1.若它的左子树不为空,则左子树上所有结点的值均小于根结点的值;

   2.若它的右子树不为空,则右子树中所有结点的值均大于根结点的值;

   3.它的左、右子树也都分别是二叉排序树。

也就是说相当于一个列表从小到大排序,然后从中间抽取了中间值,然后变成树,中间值的左边都小于它,右边都大于它。(它的查找类似于折半查找)

二叉排序树查找

  1. def search(self,key):
  2. bt=self._root #bt为树的实例化
  3. while bt:
  4. entry=bt.data #树的根结点
  5. if key < entry:
  6. bt=bt.left
  7. elif key > entry:
  8. bt=bt.right
  9. else:
  10. Return entry
  11. return None

二叉排序树插入

1.若二叉排序树为空树,则新插入的结点是新的根结点

2.若二叉排序树非空,则新插入的结点是新的叶子结点,且插入的位置由查找过程得到

二叉排序树删除

在查找成功之后进行,删除之后必须保持二叉排序树的特征。

被删除的结点是叶子结点

只需要把其双亲节点中相应指针域的值改为“空”

被删除的结点只有左子树或只有右子树

其双亲节点的相应指针域的值改为“指向被删除结点的左子树或右子树”

被删除的结点既有左子树,也有右子树

以其前替代之,然后再删除该前驱结点

最后实例:

  1. class BSTNode:
  2. def init(self, data, left=None, right=None):
  3. self.data = data #节点储存的数据
  4. self.left = left #节点左子树
  5. self.right = right #节点右子树
  6. class BinarySortTree:
  7. #基于BSTNode类的二叉查找树。维护一个根节点的指针。
  8. def init(self):
  9. self._root = None
  10. def is_empty(self):
  11. return self._root is None
  12. def search(self, key):
  13. bt = self._root
  14. while bt:
  15. entry = bt.data
  16. if key < entry:
  17. bt = bt.left
  18. elif key > entry:
  19. bt = bt.right
  20. else:
  21. return entry
  22. return None
  23. def insert(self, key): #插入操作
  24. bt = self._root
  25. if not bt:
  26. self._root = BSTNode(key)
  27. return
  28. while True:
  29. entry = bt.data
  30. if key < entry:
  31. if bt.left is None:
  32. bt.left = BSTNode(key)
  33. return
  34. bt = bt.left
  35. elif key > entry:
  36. if bt.right is None:
  37. bt.right = BSTNode(key)
  38. return
  39. bt = bt.right
  40. else:
  41. bt.data = key
  42. return
  43. def delete(self, key): #删除操作
  44. p, q = None, self._root #维持p为q的父节点,用于后面的链接操作
  45. if not q:
  46. print("空树!")
  47. return
  48. while q and q.data != key:
  49. p = q
  50. if key < q.data:
  51. q = q.left
  52. else:
  53. q = q.right
  54. if not q: #当树中没有关键码key时,结束退出。
  55. return
  56. #上面已将找到了要删除的节点,用q引用。而p则是q的父节点或者None(q为根节点时)。
  57. if not q.left:
  58. if p is None:
  59. self._root = q.right
  60. elif q is p.left:
  61. p.left = q.right
  62. else:
  63. p.right = q.right
  64. return
  65. #查找节点q的左子树的最右节点,将q的右子树链接为该节点的右子树
  66. r = q.left
  67. while r.right:
  68. r = r.right
  69. r.right = q.right
  70. if p is None:
  71. self._root = q.left
  72. elif p.left is q:
  73. p.left = q.left
  74. else:
  75. p.right = q.left
  76. def iter(self):
  77. #实现二叉树的中序遍历,展示二叉查找树. 使用python列表作为一个栈。
  78. stack = []
  79. node = self._root
  80. while node or stack:
  81. while node:
  82. stack.append(node)
  83. node = node.left
  84. node = stack.pop()
  85. yield node.data
  86. node = node.right
  87. if name == '__main__':
  88. lis = [62, 58, 88, 48, 73, 99, 35, 51, 93, 29, 37, 49, 56, 36, 50]
  89. print("排序前:")
  90. for i in lis:
  91. print(i, end=" ")
  92. bs_tree = BinarySortTree()
  93. print()
  94. print("排序后:")
  95. for i in range(len(lis)):
  96. bs_tree.insert(lis[i])
  97. for i in bs_tree:
  98. print(i, end=" ")
  99. print()
  100. print("插入55后:")
  101. bs_tree.insert(55)
  102. for i in bs_tree:
  103. print(i, end=" ")
  104. print()
  105. print("删除58后:")
  106. bs_tree.delete(58)
  107. for i in bs_tree:
  108. print(i, end=" ")
  109. print()
  110. print("查找4:")
  111. print(bs_tree.search(4))
  112. print("查找55:")
  113. print(bs_tree.search(55))

平衡二叉树

一种盖度平衡的排序二叉树,其每一个节点的左子树和右子树的高度差最多等于1,只可能是-1, 0 和 1。

特性:

1.肯定是二叉排序树;

2.因子绝对值不超过1;

3.其左子树和右子树都是平衡二叉树。

右边的就是平衡二叉树

构建平衡二叉树

最后实例:

  1. #在计算二叉树的最大深度的基础上,判断是否满足平衡二叉树的条件。
  2. class TreeNode:
  3. def init(self, x):
  4. self.val = x
  5. self.left = None
  6. self.right = None
  7. class Solution(object):
  8. def isBalanced(self, root):
  9. if not root:
  10. return True
  11. if self.depth(root) == -1: #选择-1作为返回和判断条件
  12. return False
  13. else:
  14. return True
  15. def depth(self, root):
  16. if not root:
  17. return 0
  18. left = self.depth(root.left)
  19. if left == -1: #选择-1作为返回和判断条件
  20. return -1
  21. right = self.depth(root.right)
  22. if right == -1:
  23. return -1
  24. if left > right + 1 or right > left + 1:
  25. return -1
  26. return max(left + 1, right + 1)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/993232
推荐阅读
相关标签
  

闽ICP备14008679号