Lintcode 596. Minimum Subtree

题目

Given a binary tree, find the subtree with minimum sum. Return the root of the subtree.

我的想法

结合分治和遍历。利用遍历中的全局变量来记录最小值,利用分治的向上汇报来计算每一个结点的数值和

class Result {
    TreeNode root;
    int sum;
    Result(TreeNode root, int sum) {
        this.root = root;
        this.sum = sum;
    }
}
public class Solution {
    private Result mini;
    public TreeNode findSubtree(TreeNode root) {
        mini = new Result(null, Integer.MAX_VALUE);
        divide(root);
        return mini.root;
    }
    public Result divide(TreeNode root) {
        if(root == null) {
            return new Result(null, 0);
        }
        Result left = divide(root.left);
        Result right = divide(root.right);
        int sum = left.sum + right.sum + root.val;
        if(root != null && sum < mini.sum) {
            mini.root = root;
            mini.sum = sum;
        }
        return new Result(root, sum);
    }
}

第二种解法,只用分治。需要注意的是不要只传回最小值,这样无法计算当前值了!!

class Result {
    TreeNode mini;
    int miniSum;
    TreeNode last;
    int lastSum;
    Result(TreeNode mini, int miniSum, TreeNode last, int lastSum) {
        this.mini = mini;
        this.miniSum = miniSum;
        this.last = last;
        this.lastSum = lastSum;
    }
}
public class Solution {
    public TreeNode findSubtree(TreeNode root) {
        return divide(root).mini;
    }
    public Result divide(TreeNode root) {
        if(root == null) {
            return new Result(null, Integer.MAX_VALUE, null, 0);
        }
        
        Result left = divide(root.left);
        Result right = divide(root.right);
        int sum = left.lastSum + right.lastSum + root.val;
        
        if(left.miniSum < sum && left.miniSum < right.miniSum) {
            return new Result(left.mini, left.miniSum, root, sum);
        }
        if(right.miniSum < sum && right.miniSum < left.miniSum) {
            return new Result(right.mini, right.miniSum, root, sum);
        }
        return new Result(root, sum, root, sum);
    }
}

解答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值