二叉树搜索树的查找、插入与删除

二叉树搜索树的查找、插入与删除

二叉搜索树(BST,Binary Search Tree)

二叉搜索树:一颗二叉树,可为空;若不为空,则满足以下性质:

  1. 非空左子树的所有键值<其根结点的键值

  2. 非空右子树的所有键值<其根结点的键值

  3. 左、右子树都是二叉搜索树

一、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的删除

三种情况:

  1. 删除叶结点:直接删除,并修改其父结点的指针

    删除叶结点

  2. 删除的结点只有一个孩子结点:将其父结点的指针指向要删除结点的孩子结点

    删除只有一个孩子结点的结点

  3. 要删除的结点有左、右两棵子树:用另一个结点替代被删除的结点 右子树的最小元素 或 左子树的最大元素

    用右子树最小元素代替当前结点

    左右节点_右

    用左子树最大元素代替当前结点

    左右结点_左

    程序代码

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

猜你喜欢

转载自www.cnblogs.com/wyz-2020/p/12354135.html