题目求的是整个树的tilt的值而不是单个node节点的tilt值,可以通过example看出来。
分析:
一看到树,就想到用recursion。
最小子问题是,求一个节点的tilt值。
想到大概是这个形式
Math.abs(helper(root.left) - helper(root.right))
分析下怎么写function,
传入当前节点的值: 就是当前节点TreeNode root
返回的值: 当前节点值加上其所有子树值之和
需要操作的,
求出左子树之和
求出右子树之和
得到相减的绝对值即是tilt
需要存tilt,java不像c/c++可以用一个int 变量的指针,比如传入一个int &tilt来做,所以可以用一个全局变量来代替。
这里在class中的定义内部private变量tilt,每次操作 tilt += Math.abs(helper(root.left) - helper(root.right));
当我们调用helper(即traverse)之后,在整个树的所有子节点都跑过一遍,这样就能得到整个树的tilt值之和,作为结果返回就完成了。
另外,high level来看,是一个post-order traversal问题。
先traverse左
再traverse右
最后加上当前节点值,返回
思考:
如何用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;
}
}