Skip to content

Commit 09a605c

Browse files
committed
0549. 二叉树中最长的连续序列
1 parent 908ac55 commit 09a605c

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package leetcode_0549_binary_tree_longest_consecutive_sequence_ii
2+
3+
// 0549. 二叉树中最长的连续序列
4+
// https://leetcode.cn/problems/binary-tree-longest-consecutive-sequence-ii/
5+
6+
type TreeNode struct {
7+
Val int
8+
Left *TreeNode
9+
Right *TreeNode
10+
}
11+
12+
// longestConsecutive dfs
13+
// 时间复杂度: O(n)
14+
// 空间复杂度: O(n)
15+
// 思路: 在每一个点,我们使用两个变量 inr 和 dcr,其中 inr 表示当前点为止最长增长序列的长度(包括该点自己),
16+
// dcr 表示当前点为止最长下降序列的长度(包括该点自己)。
17+
// 注意: 要是整个链路是上升或下降的,且相邻节点值差值为1
18+
// 例1:
19+
// 输入: [4,-7,-3,null,null,-9,-3,9,-7,-4,null,6,null,-6,-6,null,null,0,6,5,null,9,null,null,-1,-4,null,null,null,-2]
20+
// 输出: 2
21+
func longestConsecutive(root *TreeNode) int {
22+
var (
23+
dfs func(root *TreeNode) (int, int)
24+
ans int
25+
)
26+
// 在每一个点,我们使用两个变量 inr 和 dcr,其中 inr 表示当前点为止最长增长序列的长度(包括该点自己),
27+
// dcr 表示当前点为止最长下降序列的长度(包括该点自己)
28+
dfs = func(root *TreeNode) (int, int) {
29+
if root == nil {
30+
return 0, 0
31+
}
32+
var (
33+
incr = 1
34+
dcr = 1
35+
)
36+
if root.Left != nil {
37+
incr1, dcr1 := dfs(root.Left)
38+
if root.Val == root.Left.Val+1 {
39+
dcr = dcr1 + 1
40+
} else if root.Val == root.Left.Val-1 {
41+
incr = incr1 + 1
42+
}
43+
}
44+
if root.Right != nil {
45+
incr2, dcr2 := dfs(root.Right)
46+
if root.Val == root.Right.Val+1 {
47+
dcr = max(dcr, dcr2+1)
48+
} else if root.Val == root.Right.Val-1 {
49+
incr = max(incr, incr2+1)
50+
}
51+
}
52+
ans = max(ans, incr+dcr-1)
53+
return incr, dcr
54+
}
55+
dfs(root)
56+
return ans
57+
}
58+
59+
func max(x, y int) int {
60+
if x > y {
61+
return x
62+
}
63+
return y
64+
}

0 commit comments

Comments
 (0)