leetcode 669. Trim a Binary Search Tree

来源:互联网 发布:淘宝联盟 微信遭投诉 编辑:程序博客网 时间:2024/05/16 14:34

生命不息,奋斗不止!

@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   2L = 1R = 2Output:     1      \       2

题目意思很简单,就是一个二叉搜索树的剪枝问题,输入一个二叉查找树的root结点,并输入LR的值,要我们剪枝二叉查找树,不在L-R范围的结点都剪掉。我们很容易就会想到递归来做,以root结点做示范:

比较root.valLR,结果分以下三类情况:

  • root.val < L,那么,首先剪掉root.leftroot,然后递归调用剪枝root.right
  • root.val > R,那么首先剪掉root.rightroot,然后递归剪枝root.left
  • root.val介于LR之间,此时,我们递归剪枝root.leftroot.right,并更新root.leftroot.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;        }    }}