给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
解题思路:
二叉搜索树具有以下性质:
- 对于任意节点
root
,其左子树上所有节点的值都小于root.val
。 - 其右子树上所有节点的值都大于
root.val
。
根据这一性质,修剪树的过程可以递归地进行,判断当前节点的值是否在区间 [low, high]
之间,并根据以下规则修剪:
-
节点为空:如果当前节点为空(即树的某个分支结束),直接返回
None
,表示这个分支不再有节点。 -
节点值小于
low
:如果当前节点的值小于low
,说明当前节点及其左子树的所有节点的值都小于low
,它们都不符合条件,因此需要修剪掉当前节点和它的左子树。此时只需返回修剪后的右子树(即继续修剪右子树)。 -
节点值大于
high
:如果当前节点的值大于high
,说明当前节点及其右子树的所有节点的值都大于high
,它们都不符合条件,因此需要修剪掉当前节点和它的右子树。此时只需返回修剪后的左子树(即继续修剪左子树)。 -
节点值在
[low, high]
之间:如果当前节点的值在区间内,说明这个节点是符合条件的节点。此时需要递归修剪它的左右子树,并将修剪后的左右子树连接回当前节点的左右子树位置。
完整代码如下:
class Solution:
def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
if root is None:
return None
if root.val < low:
# 寻找符合区间 [low, high] 的节点
return self.trimBST(root.right, low, high)
if root.val > high:
# 寻找符合区间 [low, high] 的节点
return self.trimBST(root.left, low, high)
root.left = self.trimBST(root.left, low, high) # root.left 接入符合条件的左孩子
root.right = self.trimBST(root.right, low, high) # root.right 接入符合条件的右孩子
return root
class Solution:
def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
if root is None:
return None
如果当前节点为 None
,说明我们已经到达树的末端,返回 None
表示该分支结束。
if root.val < low:
# 寻找符合区间 [low, high] 的节点
return self.trimBST(root.right, low, high)
如果当前节点的值小于 low
,说明当前节点及其左子树的所有节点都小于 low
,需要修剪掉。此时只需修剪右子树并返回修剪后的右子树。
if root.val > high:
# 寻找符合区间 [low, high] 的节点
return self.trimBST(root.left, low, high)
如果当前节点的值大于 high
,说明当前节点及其右子树的所有节点都大于 high
,需要修剪掉。此时只需修剪左子树并返回修剪后的左子树。
root.left = self.trimBST(root.left, low, high) # root.left 接入符合条件的左孩子
root.right = self.trimBST(root.right, low, high) # root.right 接入符合条件的右孩子
如果当前节点的值在区间 [low, high]
之间,说明当前节点符合要求,保留它,并递归修剪它的左子树和右子树,将修剪后的左右子树重新连接回当前节点。