40
40
41
41
<!-- 这里可写通用的实现逻辑 -->
42
42
43
- DFS。
43
+ ** 方法一:DFS**
44
+
45
+ 我们设计一个函数 $dfs(root)$,表示以 $root$ 为连续序列的第一个节点的最长连续序列路径长度。
46
+
47
+ 函数 $dfs(root)$ 的执行过程如下:
48
+
49
+ 如果 $root$ 为空,那么返回 $0$。
50
+
51
+ 否则,我们递归计算 $root$ 的左右子节点,分别得到 $l$ 和 $r$,如果 $root$ 的左子节点和 $root$ 连续,那么 $l$ 的值加 $1$,否则置 $l$ 为 $1$;如果 $root$ 的右子节点和 $root$ 连续,那么 $r$ 的值加 $1$,否则置 $r$ 为 $1$。
52
+
53
+ 然后我们更新答案为 $ans = \max(ans, l, r)$,并返回 $\max(l, r)$。
54
+
55
+ 最后,我们调用 $dfs(root)$,返回答案 $ans$。
56
+
57
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
44
58
45
59
<!-- tabs:start -->
46
60
56
70
# self.left = left
57
71
# self.right = right
58
72
class Solution :
59
- def longestConsecutive (self , root : TreeNode) -> int :
60
- def dfs (root , p , t ):
61
- nonlocal ans
73
+ def longestConsecutive (self , root : Optional[TreeNode]) -> int :
74
+ def dfs (root : Optional[TreeNode]) -> int :
62
75
if root is None :
63
- return
64
- t = t + 1 if p is not None and p.val + 1 == root.val else 1
76
+ return 0
77
+ l = dfs(root.left) + 1
78
+ r = dfs(root.right) + 1
79
+ if root.left and root.left.val - root.val != 1 :
80
+ l = 1
81
+ if root.right and root.right.val - root.val != 1 :
82
+ r = 1
83
+ t = max (l, r)
84
+ nonlocal ans
65
85
ans = max (ans, t)
66
- dfs(root.left, root, t)
67
- dfs(root.right, root, t)
86
+ return t
68
87
69
- ans = 1
70
- dfs(root, None , 1 )
88
+ ans = 0
89
+ dfs(root)
71
90
return ans
72
91
```
73
92
@@ -95,19 +114,25 @@ class Solution {
95
114
private int ans;
96
115
97
116
public int longestConsecutive (TreeNode root ) {
98
- ans = 1 ;
99
- dfs(root, null , 1 );
117
+ dfs(root);
100
118
return ans;
101
119
}
102
120
103
- private void dfs (TreeNode root , TreeNode p , int t ) {
121
+ private int dfs (TreeNode root ) {
104
122
if (root == null ) {
105
- return ;
123
+ return 0 ;
124
+ }
125
+ int l = dfs(root. left) + 1 ;
126
+ int r = dfs(root. right) + 1 ;
127
+ if (root. left != null && root. left. val - root. val != 1 ) {
128
+ l = 1 ;
106
129
}
107
- t = p != null && p. val + 1 == root. val ? t + 1 : 1 ;
130
+ if (root. right != null && root. right. val - root. val != 1 ) {
131
+ r = 1 ;
132
+ }
133
+ int t = Math . max(l, r);
108
134
ans = Math . max(ans, t);
109
- dfs(root. left, root, t);
110
- dfs(root. right, root, t);
135
+ return t;
111
136
}
112
137
}
113
138
```
@@ -128,21 +153,27 @@ class Solution {
128
153
*/
129
154
class Solution {
130
155
public:
131
- int ans;
132
-
133
156
int longestConsecutive(TreeNode* root) {
134
- ans = 1;
135
- dfs(root, nullptr, 1);
157
+ int ans = 0;
158
+ function<int(TreeNode* )> dfs = [ &] (TreeNode* root) {
159
+ if (!root) {
160
+ return 0;
161
+ }
162
+ int l = dfs(root->left) + 1;
163
+ int r = dfs(root->right) + 1;
164
+ if (root->left && root->left->val - root->val != 1) {
165
+ l = 1;
166
+ }
167
+ if (root->right && root->right->val - root->val != 1) {
168
+ r = 1;
169
+ }
170
+ int t = max(l, r);
171
+ ans = max(ans, t);
172
+ return t;
173
+ };
174
+ dfs(root);
136
175
return ans;
137
176
}
138
-
139
- void dfs (TreeNode* root, TreeNode* p, int t) {
140
- if (!root) return;
141
- t = p != nullptr && p->val + 1 == root->val ? t + 1 : 1;
142
- ans = max(ans, t);
143
- dfs(root->left, root, t);
144
- dfs(root->right, root, t);
145
- }
146
177
};
147
178
```
148
179
@@ -157,24 +188,26 @@ public:
157
188
* Right *TreeNode
158
189
* }
159
190
*/
160
- func longestConsecutive(root *TreeNode) int {
161
- ans := 1
162
- var dfs func(root, p *TreeNode, t int)
163
- dfs = func(root, p *TreeNode, t int) {
191
+ func longestConsecutive(root *TreeNode) (ans int) {
192
+ var dfs func(*TreeNode) int
193
+ dfs = func(root *TreeNode) int {
164
194
if root == nil {
165
- return
195
+ return 0
196
+ }
197
+ l := dfs(root.Left) + 1
198
+ r := dfs(root.Right) + 1
199
+ if root.Left != nil && root.Left.Val-root.Val != 1 {
200
+ l = 1
166
201
}
167
- if p != nil && p.Val+1 == root.Val {
168
- t++
169
- ans = max(ans, t)
170
- } else {
171
- t = 1
202
+ if root.Right != nil && root.Right.Val-root.Val != 1 {
203
+ r = 1
172
204
}
173
- dfs(root.Left, root, t)
174
- dfs(root.Right, root, t)
205
+ t := max(l, r)
206
+ ans = max(ans, t)
207
+ return t
175
208
}
176
- dfs(root, nil, 1 )
177
- return ans
209
+ dfs(root)
210
+ return
178
211
}
179
212
180
213
func max(a, b int) int {
@@ -185,6 +218,46 @@ func max(a, b int) int {
185
218
}
186
219
```
187
220
221
+ ### ** TypeScript**
222
+
223
+ ``` ts
224
+ /**
225
+ * Definition for a binary tree node.
226
+ * class TreeNode {
227
+ * val: number
228
+ * left: TreeNode | null
229
+ * right: TreeNode | null
230
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
231
+ * this.val = (val===undefined ? 0 : val)
232
+ * this.left = (left===undefined ? null : left)
233
+ * this.right = (right===undefined ? null : right)
234
+ * }
235
+ * }
236
+ */
237
+
238
+ function longestConsecutive(root : TreeNode | null ): number {
239
+ let ans = 0 ;
240
+ const dfs = (root : TreeNode | null ): number => {
241
+ if (root === null ) {
242
+ return 0 ;
243
+ }
244
+ let l = dfs (root .left ) + 1 ;
245
+ let r = dfs (root .right ) + 1 ;
246
+ if (root .left && root .left .val - root .val !== 1 ) {
247
+ l = 1 ;
248
+ }
249
+ if (root .right && root .right .val - root .val !== 1 ) {
250
+ r = 1 ;
251
+ }
252
+ const t = Math .max (l , r );
253
+ ans = Math .max (ans , t );
254
+ return t ;
255
+ };
256
+ dfs (root );
257
+ return ans ;
258
+ }
259
+ ```
260
+
188
261
### ** ...**
189
262
190
263
```
0 commit comments