Leetcode 669.修剪二叉搜索树

669.修剪二叉搜索树

题目

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
示例 1:

输入:
1
/ \
0 2

L = 1
R = 2

输出:
1
\
2
示例 2:

输入:
3
/ \
0 4
\
2
/
1

L = 1
R = 3

输出:
3
/
2
/
1

方法

修剪不在[L,R]范围内的节点,也就是说只保留在该范围内的节点。

  • 如果$node.val>R$,修剪后的二叉搜索树应该是node的左侧
  • 如果$node.val<L$,修剪后的二叉搜索树应该在node的右侧
  • 如果当前node满足要求,则修剪node的左右子树
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    class Solution(object):
    def trimBST(self, root, L, R):
    """
    :type root: TreeNode
    :type L: int
    :type R: int
    :rtype: TreeNode
    """
    def trim(root):
    if not root:
    return None
    elif root.val>R:
    return trim(root.left)
    elif root.val<L:
    return trim(root.right)
    else:
    root.left=trim(root.left)
    root.right=trim(root.right)
    return root
    return trim(root)

复杂度分析:

  • 时间复杂度:O(N),N是给定树的结点数量,每个结点访问一次
  • 空间复杂度:O(N),尽管不显式的采用额外的空间,但是在最坏的情况下递归的栈回和结点数量一样大