Q:
Given a binary search tree and the lowest and highest boundaries as L
and R
, trim the tree so that all its elements lies in [L, R] (R >= L)
. You might need to change the root of the tree, so the result should return the new root of the trimmed binary search tree.
Example 1:
Input:
1
/ \
0 2
L = 1
R = 2
Output:
1
\
2
Example 2:
Input:
3
/ \
0 4
\
2
/
1
L = 1
R = 3
Output:
3
/
2
/
1
A:
# 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
"""
if not root:
return None
if root.val < L:
return self.trimBST(root.right, L, R)
elif root.val > R:
return self.trimBST(root.left, L, R)
root.left = self.trimBST(root.left, L, R)
root.right = self.trimBST(root.right, L, R)
return root
二叉搜索树,即二叉排序树,特点是 左子树所有节点的值均小于根节点的值,右子树所有节点的值均大于根节点的值。
此处,首先判断是否存在节点,若不存在直接返回None。然后当root.val小于L时,则左子树所有节点值均小于L,因此,舍弃左子树,递归遍历root的右子树;当root.val大于R时,则右子树所有节点值均大于R,因此,舍弃右子树,递归遍历root的左子树。
之后便是正常的左右子树递归遍历,返回root。