思路分析: 这道题与 LeetCode 删除二叉搜索树中的节点 非常类似,但是相比之下简单很多。
首先,我们知道二叉搜索树的定义是:左子树的节点元素值 < root的值 < 右子树的节点元素值,并且左子树、右子树同样满足这个条件(递归定义)。
算法描述:
如果root的值 < L,说明,root和root->left都需要删除(因为左子树的节点元素值 < root的值 < L)
如果R < root的值,说明,root和root->right都需要删除(因为R < root的值 < 右子树的节点元素值)
否则,我们递归修剪root->left、root->right,然后放到root的左子树、右子树
递归算法一般比较简洁,但是理解可能比较困难。我们不要深究每一步是怎么实现的,我们只要知道如果root的值不需要删减,就递归删减root->left,root->right,否则会越想越复杂。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode:
if root==None:
return None
if root.val<L:
return self.trimBST(root.right,L,R)
if root.val>R:
return self.trimBST(root.left,L,R)
# 属于[L,R]则保留
root.left=self.trimBST(root.left,L,R)
root.right=self.trimBST(root.right,L,R)
return root