leetcode669 修剪二叉搜索树 ★

思路分析: 这道题与 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

 

上一篇:.NET(C#) CefSharp 设置浏览器默认语言和userAgent及示例代码


下一篇:js 实现 收藏地址,设为浏览器首页,关闭浏览器