Distribute Coins in Binary Tree

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值