树
深度优先搜索
二叉树
题目描述
给定二叉树的根 root
,返回树中最长连续路径 的长度。
连续路径 是路径中相邻节点的值相差 1
的路径。此路径可以是增加或减少。
例如, [1,2,3,4]
和 [4,3,2,1]
都被认为有效,但路径 [1,2,4,3]
无效。
另一方面,路径可以是子-父-子顺序,不一定是父子顺序。
示例 1:
输入: root = [1,2,3]
输出: 2
解释: 最长的连续路径是 [1, 2] 或者 [2, 1]。
示例 2:
输入: root = [2,1,3]
输出: 3
解释: 最长的连续路径是 [1, 2, 3] 或者 [3, 2, 1]。
提示:
树上所有节点的值都在 [1, 3 * 104 ]
范围内。
-3 * 104 <= Node.val <= 3 * 104
解法
方法一
Python3 Java C++ Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def longestConsecutive ( self , root : TreeNode ) -> int :
def dfs ( root ):
if root is None :
return [ 0 , 0 ]
nonlocal ans
incr = decr = 1
i1 , d1 = dfs ( root . left )
i2 , d2 = dfs ( root . right )
if root . left :
if root . left . val + 1 == root . val :
incr = i1 + 1
if root . left . val - 1 == root . val :
decr = d1 + 1
if root . right :
if root . right . val + 1 == root . val :
incr = max ( incr , i2 + 1 )
if root . right . val - 1 == root . val :
decr = max ( decr , d2 + 1 )
ans = max ( ans , incr + decr - 1 )
return [ incr , decr ]
ans = 0
dfs ( root )
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int ans ;
public int longestConsecutive ( TreeNode root ) {
ans = 0 ;
dfs ( root );
return ans ;
}
private int [] dfs ( TreeNode root ) {
if ( root == null ) {
return new int [] { 0 , 0 };
}
int incr = 1 , decr = 1 ;
int [] left = dfs ( root . left );
int [] right = dfs ( root . right );
if ( root . left != null ) {
if ( root . left . val + 1 == root . val ) {
incr = left [ 0 ] + 1 ;
}
if ( root . left . val - 1 == root . val ) {
decr = left [ 1 ] + 1 ;
}
}
if ( root . right != null ) {
if ( root . right . val + 1 == root . val ) {
incr = Math . max ( incr , right [ 0 ] + 1 );
}
if ( root . right . val - 1 == root . val ) {
decr = Math . max ( decr , right [ 1 ] + 1 );
}
}
ans = Math . max ( ans , incr + decr - 1 );
return new int [] { incr , decr };
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public :
int ans ;
int longestConsecutive ( TreeNode * root ) {
ans = 0 ;
dfs ( root );
return ans ;
}
vector < int > dfs ( TreeNode * root ) {
if ( ! root ) return { 0 , 0 };
int incr = 1 , decr = 1 ;
auto left = dfs ( root -> left );
auto right = dfs ( root -> right );
if ( root -> left ) {
if ( root -> left -> val + 1 == root -> val ) incr = left [ 0 ] + 1 ;
if ( root -> left -> val - 1 == root -> val ) decr = left [ 1 ] + 1 ;
}
if ( root -> right ) {
if ( root -> right -> val + 1 == root -> val ) incr = max ( incr , right [ 0 ] + 1 );
if ( root -> right -> val - 1 == root -> val ) decr = max ( decr , right [ 1 ] + 1 );
}
ans = max ( ans , incr + decr - 1 );
return { incr , decr };
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func longestConsecutive ( root * TreeNode ) int {
ans := 0
var dfs func ( root * TreeNode ) [] int
dfs = func ( root * TreeNode ) [] int {
if root == nil {
return [] int { 0 , 0 }
}
incr , decr := 1 , 1
left := dfs ( root . Left )
right := dfs ( root . Right )
if root . Left != nil {
if root . Left . Val + 1 == root . Val {
incr = left [ 0 ] + 1
}
if root . Left . Val - 1 == root . Val {
decr = left [ 1 ] + 1
}
}
if root . Right != nil {
if root . Right . Val + 1 == root . Val {
incr = max ( incr , right [ 0 ] + 1 )
}
if root . Right . Val - 1 == root . Val {
decr = max ( decr , right [ 1 ] + 1 )
}
}
ans = max ( ans , incr + decr - 1 )
return [] int { incr , decr }
}
dfs ( root )
return ans
}
GitHub