【两次过】Lintcode 701. 修剪二叉搜索树

本文介绍了一种算法,用于修剪二分搜索树,使其所有节点的值位于指定的最小值和最大值之间,同时保持树的二分搜索特性。通过递归地检查每个节点,并修剪不符合条件的子树,可以有效地完成这一任务。

给定一个有根的二分搜索树和两个数字min和max,修整这个树使得所有的数字在这个新的树种都是在min和max之间(包括min和max)。然后这个所得的树仍然是合法的二分搜索树。举个例子,输入是:
https://i-blog.csdnimg.cn/blog_migrate/f52ff07f1c6702fa7ab6c630c6abdb2a.png
然后我们给定min为5和max为13,这样得到的二分搜索树的结果应该是:
https://i-blog.csdnimg.cn/blog_migrate/e4e75019a7ce7e8795aa2ab601ca7e12.png

样例

样例1

输入:
{8,3,10,1,6,#,14,#,#,4,7,13}
5
13
输出: {8, 6, 10, #, 7, #, 13}
说明:树的图片在题面描述里已经给出

样例2

输入:
{1,0,2}
1
2
输出: {1,#,2}
说明:
输入是
  1
 / \
0   2
输出是
  1
   \
    2

解题思路:

分治法。若根节点的值小于最小值,则递归调用右子树并返回右子树;
若根节点的值大于最大值,则递归调用左子树并返回左子树;
否则修剪左子树,右子树并返回根节点。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: given BST
     * @param minimum: the lower limit
     * @param maximum: the upper limit
     * @return: the root of the new tree 
     */
    public TreeNode trimBST(TreeNode root, int minimum, int maximum) {
        // write your code here
        if(root == null)
            return null;
        
        if(root.val < minimum)
            return trimBST(root.right, minimum, maximum);
        if(root.val > maximum)
            return trimBST(root.left, minimum, maximum);
        
        root.left = trimBST(root.left, minimum, maximum);
        root.right = trimBST(root.right, minimum, maximum);
        
        return root;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值