📜  删除给定范围内的BST键(1)

📅  最后修改于: 2023-12-03 15:22:44.146000             🧑  作者: Mango

删除给定范围内的BST键

在二叉搜索树 (BST) 中,每个节点都包含一个键,且每个节点的键都大于左子树中的所有节点的键,小于右子树中的所有节点的键。如果需要删除给定范围内的BST键,可以使用递归方法来实现。下面是一个Python实现的示例代码:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def deleteRange(root: TreeNode, minVal: int, maxVal: int) -> TreeNode:
    # 如果根节点为空,则返回None
    if not root:
        return None
    
    # 如果根节点的值小于最小值,则在右子树中删除
    if root.val < minVal:
        root.right = deleteRange(root.right, minVal, maxVal)
        return root
    
    # 如果根节点的值大于最大值,则在左子树中删除
    if root.val > maxVal:
        root.left = deleteRange(root.left, minVal, maxVal)
        return root
    
    # 如果根节点的值在范围内,则需要删除
    # 如果左子树为空,则返回右子树
    if not root.left:
        return root.right
    
    # 如果右子树为空,则返回左子树
    if not root.right:
        return root.left
    
    # 如果左右子树均不为空,则需要找到右子树中的最小值节点来替换根节点
    rt = root.right
    while rt.left:
        rt = rt.left
    
    # 将右子树中的最小值节点替换根节点
    root.val = rt.val
    
    # 在右子树中删除最小值节点,并返回新的右子树
    root.right = deleteRange(root.right, rt.val, maxVal)
    
    return root

代码说明如下:

首先,定义了一个TreeNode类,表示BST的节点。每个节点包含值val,以及左右子节点left和right。

接着,定义了一个deleteRange函数,其中root表示BST的根节点,minVal和maxVal分别表示待删除的键的最小值和最大值。

函数首先判断根节点是否为空,如果为空则直接返回None。

然后,判断当前根节点的值是否小于最小值,如果小于最小值,则在右子树中递归删除值为最小值的节点,并返回根节点。

接着,判断当前根节点的值是否大于最大值,如果大于最大值,则在左子树中递归删除值为最大值的节点,并返回根节点。

如果当前根节点的值在范围内,则需要删除节点。如果左子树为空,则返回右子树;如果右子树为空,则返回左子树。

如果左右子树均不为空,则需要找到右子树中的最小值节点来替换根节点。在当前节点的右子树中,不断向左遍历,找到最小值节点。

然后,将右子树中的最小值节点的值赋值给根节点;在右子树中递归删除最小值节点,并返回新的右子树。

最后,返回根节点。

这段代码的时间复杂度为O(n),其中n为BST的节点数,因为在最坏情况下,需要遍历整个BST来删除给定范围内的键。