题目
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);
}
}