leetcode 669. Trim a Binary Search Tree

生命不息,奋斗不止!

@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结点,并输入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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值