Question:
思路
这道题比较费解, 我们需要把它想简单一些.
我们可以给每个node设定一个数值, 就是它亏欠多少或者盈余多少,
比如说上面图里的example就是 root = 3,那么我们想让他最后 = 1, 那它就是盈余2.
下面两个node 每个都是val = 0, 那就是都亏欠1 => -1.
然后呢 我们做postorder recursion, 就是left right root
当走完所有node的时候, 我们统计这些node 会产生几次coin distribution.
left 和 right 此时就是Math.abs(-1) + Math.abs(-1) = 2次 就可以保证下面两个node 有1个coin.
然后呢 code 的结尾每次return 的时候, 我们return 当前node的数值,是盈余还是亏欠,
就是return left+right - 1. 为什么要减一呢, 就是我们在算盈余亏欠嘛, 本身node.val = 1代表不亏不盈, 所以我们本身就要-1来得到当前的status. 然后 return left+right呢,就是为了计算当前这个node, 要从他的children里得到什么move. 从而得到这个node 自己的status. 因为这个算完之后,就再也不需要考虑他的children了
像下面那两个0的node, 最开始就是return 了 -1. 就是亏欠
*/
class Solution {
int count = 0;
public int distributeCoins(TreeNode root) {
dfs(root);
return this.count;
}
private int dfs(TreeNode root){
if(root == null) return 0;
int left = dfs(root.left);
int right = dfs(root.right);
count += Math.abs(left) + Math.abs(right);
return root.val+left+right-1;
}
}