Leetcode.1372 二叉树中的最长交错路径 Rating : 1713
给你一棵以 root
为根的二叉树,二叉树中的交错路径定义如下:
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
请你返回给定树中最长 交错路径 的长度。
输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
这里是引用
输入:root = [1,1,1,null,1,null,null,1,1,null,1]
输出:4
解释:蓝色节点为树中最长交错路径(左 -> 右 -> 左 -> 右)。
输入:root = [1]
输出:0
50000
个节点。[1, 100]
之间。分析:
我们定义这样一个函数 d f s ( r o o t , i s L e f t , l e n ) dfs(root , isLeft , len) dfs(root,isLeft,len),表示 root
的父结点 朝(isLeft == true
就是左边,否则是右边)走,包括当前 root
结点在内的 Z
字路径长度为len
。
如果 isLeft == true
,那么:
len + 1
。root
的右结点为 null
的情况,所以这里也要记录 以root.left
为路径起始结点的情况。如果 isLeft == false
,和上面的情况类似:
最后再分别以 初始方向为左边 和 初始方向为右边,遍历两次。最终就能得到整棵树中的,最长的 Z
字形路径长度。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {
public:
int ans = 0;
void dfs(TreeNode* root,bool isLeft,int len){
if(root == nullptr) return;
ans = max(ans,len);
//上一个是左边
if(isLeft){
dfs(root->right,false,len + 1);
dfs(root->left,true,1);
}
//上一个是右边
else{
dfs(root->left,true,len + 1);
dfs(root->right,false,1);
}
}
int longestZigZag(TreeNode* root) {
dfs(root,true,0);
dfs(root,false,0);
return ans;
}
};
Java代码:
class Solution {
int ans = 0;
private void dfs(TreeNode root,boolean isLeft,int len){
if(root == null) return;
ans = Math.max(ans,len);
if(isLeft){
dfs(root.right,false,len + 1);
dfs(root.left,true,1);
}
else{
dfs(root.left,true,len + 1);
dfs(root.right,false,1);
}
}
public int longestZigZag(TreeNode root) {
dfs(root,true,0);
dfs(root,false,0);
return ans;
}
}