leetcode 1372. Longest ZigZag Path in a Binary Tree(二叉树中最长的之字形路径)
找出最长的之字型路径长度。
可以选择从二叉树的任意一个节点出发。
路径长度为路径中的节点数-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重新开始}}
}