Skip to content

Commit 4724767

Browse files
authored
feat: add solutions to lc problem: No.0298 (#1434)
No.0298.Binary Tree Longest Consecutive Sequence
1 parent 58a3719 commit 4724767

File tree

7 files changed

+366
-180
lines changed

7 files changed

+366
-180
lines changed

solution/0200-0299/0298.Binary Tree Longest Consecutive Sequence/README.md

+116-43
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,21 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

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$ 是二叉树的节点数。
4458

4559
<!-- tabs:start -->
4660

@@ -56,18 +70,23 @@ DFS。
5670
# self.left = left
5771
# self.right = right
5872
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:
6275
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
6585
ans = max(ans, t)
66-
dfs(root.left, root, t)
67-
dfs(root.right, root, t)
86+
return t
6887

69-
ans = 1
70-
dfs(root, None, 1)
88+
ans = 0
89+
dfs(root)
7190
return ans
7291
```
7392

@@ -95,19 +114,25 @@ class Solution {
95114
private int ans;
96115

97116
public int longestConsecutive(TreeNode root) {
98-
ans = 1;
99-
dfs(root, null, 1);
117+
dfs(root);
100118
return ans;
101119
}
102120

103-
private void dfs(TreeNode root, TreeNode p, int t) {
121+
private int dfs(TreeNode root) {
104122
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;
106129
}
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);
108134
ans = Math.max(ans, t);
109-
dfs(root.left, root, t);
110-
dfs(root.right, root, t);
135+
return t;
111136
}
112137
}
113138
```
@@ -128,21 +153,27 @@ class Solution {
128153
*/
129154
class Solution {
130155
public:
131-
int ans;
132-
133156
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);
136175
return ans;
137176
}
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-
}
146177
};
147178
```
148179
@@ -157,24 +188,26 @@ public:
157188
* Right *TreeNode
158189
* }
159190
*/
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 {
164194
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
166201
}
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
172204
}
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
175208
}
176-
dfs(root, nil, 1)
177-
return ans
209+
dfs(root)
210+
return
178211
}
179212
180213
func max(a, b int) int {
@@ -185,6 +218,46 @@ func max(a, b int) int {
185218
}
186219
```
187220

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+
188261
### **...**
189262

190263
```

0 commit comments

Comments
 (0)