二叉搜索树
二叉搜索树
定义/特点:
1. 如果二叉树有左子树,则左子树上所有的节点的值都小于或者等于根节点的值
2. 如果二叉树有右子树,则右子树上所有的节点的值都大于或者等于根节点的值
3. 其左右子树也是二叉搜索树
一. 构建二叉树(不断的给二叉树添加节点)
二. 查询二叉搜索树
在二叉搜索树中查询指定值
2.1 如果要查的值大于当前节点,则向当前节点的右子树进行查询
2.2 如果要查询的值小于当前节点,则向当前节点的左子树查询
2.3 如果要查询的值等于当前节点,则返回True
2.4 如果查询到最后都没有查到,返回False
查找二叉搜索树中最大最小值
class Node():
def __init__(self,value):
self.value = value
self.left = None
self.right = None
def insert(self,root,value):
# """
# 1. 如果二叉树有左子树,则左子树上所有的节点的值都小于或者等于根节点的值
# 2. 如果二叉树有右子树,则右子树上所有的节点的值都大于或者等于根节点的值
# 3. 其左右子树也是二叉搜索树
# """
#①:根节点为空的情况
if not root:
root = Node(value)
#②:插入的值小于根节点的值
if value<root.value:
root.left = insert(root.left,value)
elif value > self.root.value:
root.right = insert(root.right,value)
return root
def search(root,value):
# """
# 2.1 如果要查的值大于当前节点,则向当前节点的右子树进行查询
# 2.2 如果要查询的值小于当前节点,则向当前节点的左子树查询
# 2.3 如果要查询的值等于当前节点,则返回True
# 2.4 如果查询到最后都没有查到,返回False
# """
# 递归的结束条件
if root == None:
return False
if root.value == value:
return True
elif value < root.value:
return search(root.left,value)
elif value > root.value:
return search(root.right,value)
def find_max_value(root):
if root.right:
return find_max_value(root.right)
else:
return root.value
def del_node(root,value):
# """
# 1. 待删除的节点无左右子树(删除的是叶子节点)----直接删除即可
# 2. 待删除的节点只有左子树,或者只有右子树----将左右子树的根节点代替待删除节点
# 3. 待删除的节点既有左子树又有右子树的情况
# 3.1 找到待删除节点的左子树中的最大值,替换待删除的节点的值,然后删除其左子树的最大值节点
# 3.2 找到待删除节点的右子树中的最小,替换待删除的节点的值,然后删除其右子树的最小值节点
# """
if root == None:
return
if value < root.value:
root.left = del_node(root.left,value)
elif value > root.value:
root.right = del_node(root.right,value)
if value == root.value:
if not root.left and not root.right:
root =None
elif not root.left:
root = root.right
elif not root.right:
root = root.left
else:
#找到左子树的最大值,替换当前节点值
temp = find_max_value(root.left)
#左子树的最大,换当前节点值
root.value = temp
root.left = del_node(root.left,temp)
return root
if __name__=="__main__":
my_list=[8,5,10,2,6,9,11]
bst=Node(5)
print(bst)
for e in my_list:
insert(e,[5,9])

浙公网安备 33010602011771号