二叉树搜索树的查找、插入与删除
二叉搜索树(BST,Binary Search Tree)
二叉搜索树:一颗二叉树,可为空;若不为空,则满足以下性质:
非空左子树的所有键值<其根结点的键值
非空右子树的所有键值<其根结点的键值
左、右子树都是二叉搜索树
一、bst的查找
包括数据查找和最小最大值的查找。
Position Find(ElementType X, BinTree BST): 从BST中查找元素X,返回其结点所在的地址。
思路:查找从根结点开始,如果树为空,返回NULL
若搜索树非空,则根结点关键字和X进行比较,并进行不同处理:
(1) 若X<根结点键值,只需在左子树中继续搜索
(2) 若X>根结点键值,则在右子树中继续搜索
(3) 若x=根结点键值,搜索完成,返回指向此结点的指针
程序代码
def find(self, root, val):
if not root:
return False
if root.val == val:
return True
elif root.val < val:
return find(root.left, val)
elif root.val > val:
return find(root.right, val)
Position FindMin(BST): 从BST中查找并返回最小元素所在的结点的地址。
程序代码
def findMin(self, root):
if root.left:
return findMin(root.left)
else:
return root
Position FindMax(BST): 从BST中查找并返回最大元素所在的结点的地址。
程序代码
def findMax(self, root):
if root.right:
return findMax(root.right)
else:
return root
二、bst的插入
从根节点开始,若插入的值比根节点的值小,则将其插入根节点的左子树;若比根节点的值大,则将其插入根节点的右子树。该操作可使用递归进行实现。
程序代码
def insert(self, root, val):
if not root:
root = TreeNode(val)
elif val < root.val:
root.left = self.insert(root.left, val)
elif val > root.val:
root.right = self.insert(root.right, val)
return root
三、bst的删除
三种情况:
删除叶结点:直接删除,并修改其父结点的指针
删除的结点只有一个孩子结点:将其父结点的指针指向要删除结点的孩子结点
要删除的结点有左、右两棵子树:用另一个结点替代被删除的结点 右子树的最小元素 或 左子树的最大元素
用右子树最小元素代替当前结点
用左子树最大元素代替当前结点
程序代码
def delNode(self, root, val):
if not root:
return
if val < root.val:
root.left = self.delNode(root.left, val)
elif val > root.val:
root.right = self.delNode(root.right, val)
else:
if root.left and root.right:
# 既有左子树又有右子树
temp = self.findMin(root.right)
# 右子树的最小值
root.val = temp.val
# 将当前结点替换成右子树中最小值
root.right = self.delNode(root.right, temp.val)
# 将右结点删除
elif not root.right and not root.left:
# 左右子树都为空
root = None
elif not root.right:
# 只有左子树
root = root.left
elif not root.left:
# 只有右子树
root = root.right
return root