题目链接
Leetcode.1372 二叉树中的最长交错路径 Rating : 1713
题目描述
给你一棵以 root
为根的二叉树,二叉树中的交错路径定义如下:
- 选择二叉树中 任意 节点和一个方向(左或者右)。
- 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
- 改变前进方向:左变右或者右变左。
- 重复第二步和第三步,直到你在树中无法继续移动。
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
请你返回给定树中最长 交错路径 的长度。
示例 1:
输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
示例 2:
这里是引用
输入:root = [1,1,1,null,1,null,null,1,1,null,1]
输出:4
解释:蓝色节点为树中最长交错路径(左 -> 右 -> 左 -> 右)。
示例 3:
输入: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
,那么:
-
d
f
s
(
r
o
o
t
.
r
i
g
h
t
,
f
a
l
s
e
,
l
e
n
+
1
)
dfs(root.right , false , len + 1)
dfs(root.right,false,len+1),如果之前的方向是朝左,现在的方向就要朝右,并且
len + 1
。 -
d
f
s
(
r
o
o
t
.
l
e
f
t
,
t
r
u
e
,
1
)
dfs(root.left , true , 1)
dfs(root.left,true,1),可能会出现
root
的右结点为null
的情况,所以这里也要记录 以root.left
为路径起始结点的情况。
如果 isLeft == false
,和上面的情况类似:
- d f s ( r o o t . l e f t , t r u e , l e n + 1 ) dfs(root.left, true, len + 1) dfs(root.left,true,len+1)。
- d f s ( r o o t . r i g h t , f a l s e , 1 ) dfs(root.right, false, 1) dfs(root.right,false,1)
最后再分别以 初始方向为左边 和 初始方向为右边,遍历两次。最终就能得到整棵树中的,最长的 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;
}
}