给定一个二叉搜索树,同时给定最小边界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] 之间,说明当前节点符合要求,保留它,并递归修剪它的左子树和右子树,将修剪后的左右子树重新连接回当前节点。
441

被折叠的 条评论
为什么被折叠?



