生命不息,奋斗不止!
–
@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.rightroot.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;
}
}
}

本文介绍了一种针对二叉查找树的剪枝算法,该算法通过递归方式去除所有值不在指定范围内的节点,确保最终树中所有节点的值位于给定区间[L, R]内。
507

被折叠的 条评论
为什么被折叠?



