题目地址:
https://leetcode.com/problems/longest-zigzag-path-in-a-binary-tree/
给定一棵二叉树,求其最长的形如"左右左右……”或者“右左右左……”下降路径长度。返回最长路径边数。
思路是DFS。每次遍历到一个节点的时候,就算一下从它向下的形如"左右左右……”和“右左右左……”的最长路径节点数都算出来,更新答案,并且返回上层。代码如下:
public class Solution {
private int res;
public int longestZigZag(TreeNode root) {
res = 1;
dfs(root);
// res存的是最长路径节点数,减去1才是边数
return res - 1;
}
// 返回从cur向左向右走的最大zigzag路径的节点数,
// [0]代表向左走,[1]代表向右边走
private int[] dfs(TreeNode cur) {
if (cur == null) {
return new int[]{0, 0};
}
int[] left = dfs(cur.left), right = dfs(cur.right);
res = Math.max(res, 1 + left[1]);
res = Math.max(res, 1 + right[0]);
return new int[]{1 + left[1], 1 + right[0]};
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。
C++:
class Solution {
public:
int res = 0;
int longestZigZag(TreeNode* root) {
dfs(root);
return res;
}
pair<int, int> dfs(TreeNode* cur) {
if (!cur) return {0, 0};
auto p1 = dfs(cur->left), p2 = dfs(cur->right);
res = max(res, max(p1.second, p2.first));
return {1 + p1.second, 1 + p2.first};
}
};
时空复杂度一样。