找出最长的之字型路径长度。
可以选择从二叉树的任意一个节点出发。
路径长度为路径中的节点数-1.
思路:
符合DFS的特征。
方向是左右交替的,可以定义0,1两个方向。
如果当前方向是左,下一方向就是右,反之亦然。每次长度+1.
在所有长度中记录下最大长度。
有一个问题是可以从任意点出发,是不是还要涉及到遍历二叉树的每个节点,然后对每个节点zigzag呢?
其实可以通过一个方法解决,
比如前一个方向是左,那么下一个方向右的时候长度是+1的,
同时也尝试下一方向是左的情况,这时长度从0+1重新开始。
主要难点就在这里,这个解决了就都好办。
class Solution {
final int LEFT = 0;
final int RIGHT = 1;
int maxStep = 0;
public int longestZigZag(TreeNode root) {
zigzag(root, LEFT, 0);
return maxStep;
}
void zigzag(TreeNode root, int direct, int len) {
if(root == null) return;
if(len > maxStep) maxStep = len; //比Math.max快
if(direct == LEFT) {
zigzag(root.left, RIGHT, len+1);
zigzag(root.right, LEFT, 1); //从root.right重新开始
} else {
zigzag(root.right, LEFT, len+1);
zigzag(root.left, RIGHT, 1); //从root.left重新开始
}
}
}