题目地址:
https://www.lintcode.com/problem/minimum-subtree/description
给定一个二叉树,求其和最小子树的树根。
最简便的方法是开一个全局变量,然后用递归的方式计算所有子树的和,同时不停更新那个最小子树和与那个树根。这样的好处是,回避了函数传递变量的麻烦。主要的原因是,我们在递归计算子树和的时候,不但要知道左右子树分别的最小子树和与两个最小子树的树根,而且为了计算本树的和,还需要知道左右子树各自的和,变量太多,传递起来非常不方便。而开一个全局变量并对其不断更新的话,我们就只需要计算子树和就行了,省去非常大的麻烦。代码如下:
public class Solution {
TreeNode minRoot = null;
int minSum = Integer.MAX_VALUE;
/**
* @param root: the root of binary tree
* @return: the root of the minimum subtree
*/
public TreeNode findSubtree(TreeNode root) {
// write your code here
dfs(root);
return minRoot;
}
// 递归求解子树和
private int dfs(TreeNode root) {
// 如果到了null节点,则返回0(视为空树)
if (root == null) {
return 0;
}
// 分治法,分别求解左右子树的和
int leftSum = dfs(root.left), rightSum = dfs(root.right);
// 计算一下本树的和
int subSum = leftSum + rightSum + root.val;
// 如果全局变量可以被更新,则更新之
if (minSum > leftSum + rightSum + root.val) {
minSum = leftSum + rightSum + root.val;
minRoot = root;
}
// 最后需要将本树的和作为结果返回
return subSum;
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。