題目求的是整個樹的tilt的值而不是單個node節(jié)點的tilt值,可以通過example看出來。
分析:
一看到樹,就想到用recursion。
最小子問題是,求一個節(jié)點的tilt值。
想到大概是這個形式
Math.abs(helper(root.left) - helper(root.right))
分析下怎么寫function,
傳入當前節(jié)點的值: 就是當前節(jié)點TreeNode root
返回的值: 當前節(jié)點值加上其所有子樹值之和
需要操作的,
求出左子樹之和
求出右子樹之和
得到相減的絕對值即是tilt
需要存tilt,java不像c/c++可以用一個int 變量的指針,比如傳入一個int &tilt來做,所以可以用一個全局變量來代替。
這里在class中的定義內部private變量tilt,每次操作 tilt += Math.abs(helper(root.left) - helper(root.right));
當我們調用helper(即traverse)之后,在整個樹的所有子節(jié)點都跑過一遍,這樣就能得到整個樹的tilt值之和,作為結果返回就完成了。
另外,high level來看,是一個post-order traversal問題。
先traverse左
再traverse右
最后加上當前節(jié)點值,返回
思考:
如何用iterative的方式解決
public class Solution {
int tilt = 0;
public int findTilt(TreeNode root) {
traverse(root);
return tilt;
}
private int traverse(TreeNode root)
{
if(root == null) {
return 0;
}
int left = traverse(root.left);
int right = traverse(root.right);
tilt += Math.abs(left - right);
return left + right + root.val;
}
}