思路:从下到上的角度思考每个结点。
以每个结点为根结点对应的子树中价值和记为val(node),总共需要的价值和记为count(node)
如果val(node)>count(node),代表要运输val(node)-count(node)个硬币给父节点。
如果val(node)<count(node),代表要运输count(node)-val(node)个硬币给左/右子树。
所以move的次数要加上左右子树的Math.abs(val(node)-count(node))。
返回给上一层的价值和差值为左子树价值差加上右子树价值差+当前点值-1(根结点需要1枚硬币)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int move=0;
public int distributeCoins(TreeNode root) {
dfs(root);
return move;
}
public int dfs(TreeNode node) {
if(node==null)return 0;
int leftCount=0,rightCount=0;
if(node.left!=null) {
leftCount = dfs(node.left);
}
if(node.right!=null) {
rightCount = dfs(node.right);
}
move+=Math.abs(leftCount)+Math.abs(rightCount);
return leftCount+rightCount+node.val-1;
}
}