二叉树——19.修剪二叉搜索树

力扣题目链接

给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。

解题思路:

二叉搜索树具有以下性质:

  • 对于任意节点 root,其左子树上所有节点的值都小于 root.val
  • 其右子树上所有节点的值都大于 root.val

根据这一性质,修剪树的过程可以递归地进行,判断当前节点的值是否在区间 [low, high] 之间,并根据以下规则修剪:

  1. 节点为空:如果当前节点为空(即树的某个分支结束),直接返回 None,表示这个分支不再有节点。

  2. 节点值小于 low:如果当前节点的值小于 low,说明当前节点及其左子树的所有节点的值都小于 low,它们都不符合条件,因此需要修剪掉当前节点和它的左子树。此时只需返回修剪后的右子树(即继续修剪右子树)。

  3. 节点值大于 high:如果当前节点的值大于 high,说明当前节点及其右子树的所有节点的值都大于 high,它们都不符合条件,因此需要修剪掉当前节点和它的右子树。此时只需返回修剪后的左子树(即继续修剪左子树)。

  4. 节点值在 [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] 之间,说明当前节点符合要求,保留它,并递归修剪它的左子树和右子树,将修剪后的左右子树重新连接回当前节点。

你可能感兴趣的:(算法)