📅  最后修改于: 2023-12-03 15:22:44.146000             🧑  作者: Mango
在二叉搜索树 (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来删除给定范围内的键。