手撕LeetCode #669 & # 938——Python

2020-09-08  本文已影响0人  烟花如雨旧故里

#669 修剪二叉搜索树

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

#938 二叉搜索树的范围和

给定二叉搜索树的根结点root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。

解题思路:
这两道题其实解法很相似,充分利用递归来解决二叉搜索树的问题。

修剪二叉搜索树:对于某一个node,如果node<L,那么修剪后的二叉树就在这个node的右边;
如果node>R,那么修剪后的二叉树就在这个node的左边;
其他情况,就说明node在修剪后的二叉树中,也就只需对该node的children递归作相同处理。

def trim(node, L, R):
    if not node:
        return None
    if node.val < L:
        return trim(node.right, L, R)
    elif node.val > R:
        return trim(node.left, L, R)
    else:
        node.left = trim(node.left, L, R)
        node.right = trim(node.right, L, R)
        return node

二叉搜索树的范围和:有了上一题的经验,我们只需要在node处于[L, R]范围中时,加上该node的值。

def sum(node, L, R):
    if not node:
        return 0
    if node.val < L:
        return sum(node.right, L, R)
    elif node.val > R:
        return sum(node.left, L, R)
    else:
        return node.val + sum(node.left, L, R) + sum(node.right, L, R)

时间复杂度和空间复杂度均为O(N),其中N为二叉搜索树的节点数,因为最多会遍历每一个节点。

上一篇下一篇

猜你喜欢

热点阅读