生命不息,奋斗不止!
–
@author stormma
@date 2017/10/20
题目
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
Input:
1
/ \
0 2
L = 1
R = 2
Output:
1
\
2
题目意思很简单,就是一个二叉搜索树的剪枝问题,输入一个二叉查找树的root结点,并输入L
和R
的值,要我们剪枝二叉查找树,不在L
-R
范围的结点都剪掉。我们很容易就会想到递归来做,以root
结点做示范:
比较root.val
和L
,R
,结果分以下三类情况:
root.val
<L
,那么,首先剪掉root.left
和root
,然后递归调用剪枝root.right
root.val
> R,那么首先剪掉root.right
和root
,然后递归剪枝root.left
。root.val
介于L
和R
之间,此时,我们递归剪枝root.left
和root.right
,并更新root.left
和root.right
结点。
代码实现:
package me.stormma.leetcode;
/**
* leetcode 669. 剪枝二叉查找树 <a href="https://leetcode.com/problems/trim-a-binary-search-tree">题目链接</a>
*
* @author stormma
* @date 2017/10/19
*/
public class Question669 {
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
static class Solution {
public TreeNode trimBST(TreeNode root, int L, int R) {
if (root == null) {
return null;
}
// trim left subtree and right subtree.
if (L <= root.val && root.val <= R) {
root.left = trimBST(root.left, L, R);
root.right = trimBST(root.right, L, R);
} else if (root.val < L) {
root = trimBST(root.right, L, R);
} else {
root = trimBST(root.left, L, R);
}
return root;
}
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}