Skip to content

Commit ae64403

Browse files
authored
feat: add solutions to lc problem: No.2458 (#3673)
1 parent 26650aa commit ae64403

File tree

4 files changed

+280
-0
lines changed

4 files changed

+280
-0
lines changed

solution/2400-2499/2458.Height of Binary Tree After Subtree Removal Queries/README.md

+100
Original file line numberDiff line numberDiff line change
@@ -289,4 +289,104 @@ func treeQueries(root *TreeNode, queries []int) (ans []int) {
289289

290290
<!-- solution:end -->
291291

292+
<!-- solution:start -->
293+
294+
### 方法二:一次 DFS + 排序
295+
296+
<!-- tabs:start -->
297+
298+
#### TypeScript
299+
300+
```ts
301+
function treeQueries(root: TreeNode | null, queries: number[]): number[] {
302+
const ans: number[] = [];
303+
const levels: Map<number, [number, number][]> = new Map();
304+
const valToLevel = new Map<number, number>();
305+
306+
const dfs = (node: TreeNode | null, level = 0): number => {
307+
if (!node) return level - 1;
308+
309+
const max = Math.max(dfs(node.left, level + 1), dfs(node.right, level + 1));
310+
311+
if (!levels.has(level)) {
312+
levels.set(level, []);
313+
}
314+
levels.get(level)?.push([max, node.val]);
315+
valToLevel.set(node.val, level);
316+
317+
return max;
318+
};
319+
320+
dfs(root, 0);
321+
322+
for (const [_, l] of levels) {
323+
l.sort(([a], [b]) => b - a);
324+
}
325+
326+
for (const q of queries) {
327+
const level = valToLevel.get(q)!;
328+
const maxes = levels.get(level)!;
329+
330+
if (maxes.length === 1) {
331+
ans.push(level - 1);
332+
} else {
333+
const [val0, max0, max1] = [maxes[0][1], maxes[0][0], maxes[1][0]];
334+
const max = val0 === q ? max1 : max0;
335+
ans.push(max);
336+
}
337+
}
338+
339+
return ans;
340+
}
341+
```
342+
343+
#### JavaScript
344+
345+
```js
346+
function treeQueries(root, queries) {
347+
const ans = [];
348+
const levels = new Map();
349+
const valToLevel = new Map();
350+
351+
const dfs = (node, level = 0) => {
352+
if (!node) return level - 1;
353+
354+
const max = Math.max(dfs(node.left, level + 1), dfs(node.right, level + 1));
355+
356+
if (!levels.has(level)) {
357+
levels.set(level, []);
358+
}
359+
levels.get(level)?.push([max, node.val]);
360+
valToLevel.set(node.val, level);
361+
362+
return max;
363+
};
364+
365+
dfs(root, 0);
366+
367+
for (const [_, l] of levels) {
368+
l.sort(([a], [b]) => b - a);
369+
}
370+
371+
for (const q of queries) {
372+
const level = valToLevel.get(q);
373+
const maxes = levels.get(level);
374+
375+
if (maxes.length === 1) {
376+
ans.push(level - 1);
377+
} else {
378+
const [val0, max0, max1] = [maxes[0][1], maxes[0][0], maxes[1][0]];
379+
const max = val0 === q ? max1 : max0;
380+
ans.push(max);
381+
}
382+
}
383+
384+
return ans;
385+
}
386+
```
387+
388+
<!-- tabs:end -->
389+
390+
<!-- solution:end -->
391+
292392
<!-- problem:end -->

solution/2400-2499/2458.Height of Binary Tree After Subtree Removal Queries/README_EN.md

+100
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,104 @@ func treeQueries(root *TreeNode, queries []int) (ans []int) {
283283

284284
<!-- solution:end -->
285285

286+
<!-- solution:start -->
287+
288+
### Solution 2: One DFS + Sorting
289+
290+
<!-- tabs:start -->
291+
292+
#### TypeScript
293+
294+
```ts
295+
function treeQueries(root: TreeNode | null, queries: number[]): number[] {
296+
const ans: number[] = [];
297+
const levels: Map<number, [number, number][]> = new Map();
298+
const valToLevel = new Map<number, number>();
299+
300+
const dfs = (node: TreeNode | null, level = 0): number => {
301+
if (!node) return level - 1;
302+
303+
const max = Math.max(dfs(node.left, level + 1), dfs(node.right, level + 1));
304+
305+
if (!levels.has(level)) {
306+
levels.set(level, []);
307+
}
308+
levels.get(level)?.push([max, node.val]);
309+
valToLevel.set(node.val, level);
310+
311+
return max;
312+
};
313+
314+
dfs(root, 0);
315+
316+
for (const [_, l] of levels) {
317+
l.sort(([a], [b]) => b - a);
318+
}
319+
320+
for (const q of queries) {
321+
const level = valToLevel.get(q)!;
322+
const maxes = levels.get(level)!;
323+
324+
if (maxes.length === 1) {
325+
ans.push(level - 1);
326+
} else {
327+
const [val0, max0, max1] = [maxes[0][1], maxes[0][0], maxes[1][0]];
328+
const max = val0 === q ? max1 : max0;
329+
ans.push(max);
330+
}
331+
}
332+
333+
return ans;
334+
}
335+
```
336+
337+
#### JavaScript
338+
339+
```js
340+
function treeQueries(root, queries) {
341+
const ans = [];
342+
const levels = new Map();
343+
const valToLevel = new Map();
344+
345+
const dfs = (node, level = 0) => {
346+
if (!node) return level - 1;
347+
348+
const max = Math.max(dfs(node.left, level + 1), dfs(node.right, level + 1));
349+
350+
if (!levels.has(level)) {
351+
levels.set(level, []);
352+
}
353+
levels.get(level)?.push([max, node.val]);
354+
valToLevel.set(node.val, level);
355+
356+
return max;
357+
};
358+
359+
dfs(root, 0);
360+
361+
for (const [_, l] of levels) {
362+
l.sort(([a], [b]) => b - a);
363+
}
364+
365+
for (const q of queries) {
366+
const level = valToLevel.get(q);
367+
const maxes = levels.get(level);
368+
369+
if (maxes.length === 1) {
370+
ans.push(level - 1);
371+
} else {
372+
const [val0, max0, max1] = [maxes[0][1], maxes[0][0], maxes[1][0]];
373+
const max = val0 === q ? max1 : max0;
374+
ans.push(max);
375+
}
376+
}
377+
378+
return ans;
379+
}
380+
```
381+
382+
<!-- tabs:end -->
383+
384+
<!-- solution:end -->
385+
286386
<!-- problem:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
function treeQueries(root, queries) {
2+
const ans = [];
3+
const levels = new Map();
4+
const valToLevel = new Map();
5+
6+
const dfs = (node, level = 0) => {
7+
if (!node) return level - 1;
8+
9+
const max = Math.max(dfs(node.left, level + 1), dfs(node.right, level + 1));
10+
11+
if (!levels.has(level)) {
12+
levels.set(level, []);
13+
}
14+
levels.get(level)?.push([max, node.val]);
15+
valToLevel.set(node.val, level);
16+
17+
return max;
18+
};
19+
20+
dfs(root, 0);
21+
22+
for (const [_, l] of levels) {
23+
l.sort(([a], [b]) => b - a);
24+
}
25+
26+
for (const q of queries) {
27+
const level = valToLevel.get(q);
28+
const maxes = levels.get(level);
29+
30+
if (maxes.length === 1) {
31+
ans.push(level - 1);
32+
} else {
33+
const [val0, max0, max1] = [maxes[0][1], maxes[0][0], maxes[1][0]];
34+
const max = val0 === q ? max1 : max0;
35+
ans.push(max);
36+
}
37+
}
38+
39+
return ans;
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
function treeQueries(root: TreeNode | null, queries: number[]): number[] {
2+
const ans: number[] = [];
3+
const levels: Map<number, [number, number][]> = new Map();
4+
const valToLevel = new Map<number, number>();
5+
6+
const dfs = (node: TreeNode | null, level = 0): number => {
7+
if (!node) return level - 1;
8+
9+
const max = Math.max(dfs(node.left, level + 1), dfs(node.right, level + 1));
10+
11+
if (!levels.has(level)) {
12+
levels.set(level, []);
13+
}
14+
levels.get(level)?.push([max, node.val]);
15+
valToLevel.set(node.val, level);
16+
17+
return max;
18+
};
19+
20+
dfs(root, 0);
21+
22+
for (const [_, l] of levels) {
23+
l.sort(([a], [b]) => b - a);
24+
}
25+
26+
for (const q of queries) {
27+
const level = valToLevel.get(q)!;
28+
const maxes = levels.get(level)!;
29+
30+
if (maxes.length === 1) {
31+
ans.push(level - 1);
32+
} else {
33+
const [val0, max0, max1] = [maxes[0][1], maxes[0][0], maxes[1][0]];
34+
const max = val0 === q ? max1 : max0;
35+
ans.push(max);
36+
}
37+
}
38+
39+
return ans;
40+
}

0 commit comments

Comments
 (0)