Question
思路
这道题的解法也是dfs, 但是要结合一下array, 就非常nb
首先题目要求我们要zigZag Path, 就是left -> right -> left -> right -> left
所以, 这个题的难点就在如何判断这个left right left right的顺序, 我们可以利用一个dfs的特性
就是dfs每次都是往left node/right node 往下走. 那么我们如果每次return 都return 一个array 来记录从当前node往左下走和往右下走的最长length, 在code中我们在稍微操作一下
让left return 回来的 去和它的往右下走的length 相加. 反之 right return 回来的加它的往左下走的length.
大概思路就是上述, 下面结合code解释解释
首先每个root return 一个array [left, right, result]
left = 从这个root往左边走能得到的最长zigZig path length
right = 从这个root 往右边走得到的最长zigzig path 的length
result = 这个node出发能得到的最长的zigzig path长度
所以当root == null 的时候 return [-1,-1,-1] 就是leaf node 的left 和 right
接着往上recurse back的时候, 就是用Math.max(left[1] , right[0]) 来找出更长length的一侧
因为left是从left node 过来的, left[1] 就是left node 的right node 的最长length, 这个符合zigzig 一左一右的规律.
然后因为有可能left/right node 下面是好几个subtree, 所以我们需要继续再用当前的max(left[1],right[0]) 和 Math.max(left[2],right[2])这个global length 去比较一下.
解释到这儿就差不多了.
class Solution {
public int longestZigZag(TreeNode root) {
return dfs(root)[2];
}
private int[] dfs(TreeNode root) {
if (root == null) return new int[]{-1, -1, -1};
int[] left = dfs(root.left), right = dfs(root.right);
int res = Math.max(Math.max(left[1], right[0]) + 1, Math.max(left[2], right[2]));
return new int[]{left[1] + 1, right[0] + 1, res};
}
}