二叉搜索树

二叉搜索树
定义/特点:
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])

  

posted @ 2020-08-13 18:49  进阶的淑琴  阅读(137)  评论(0)    收藏  举报