Skip to content

Commit 523bba1

Browse files
committed
二刷1110
1 parent bc3302b commit 523bba1

File tree

4 files changed

+92
-22
lines changed

4 files changed

+92
-22
lines changed
Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,65 @@
11
[#1110-delete-nodes-and-return-forest]
2-
= 1110. Delete Nodes And Return Forest
2+
= 1110. 删点成林
33

4-
{leetcode}/problems/delete-nodes-and-return-forest/[LeetCode - Delete Nodes And Return Forest^]
4+
https://leetcode.cn/problems/delete-nodes-and-return-forest/[LeetCode - 1110. 删点成林 ^]
55

6-
Given the `root` of a binary tree, each node in the tree has a distinct value.
6+
给出二叉树的根节点 `root`,树上每个节点都有一个不同的值。
77

8-
After deleting all nodes with a value in `to_delete`, we are left with a forest (a disjoint union of trees).
8+
如果节点值在 `to_delete` 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。
99

10-
Return the roots of the trees in the remaining forest. You may return the result in any order.
10+
返回森林中的每棵树。你可以按任意顺序组织答案。
1111

12-
13-
*Example 1:*
12+
*示例 1:*
1413

15-
image::https://assets.leetcode.com/uploads/2019/07/01/screen-shot-2019-07-01-at-53836-pm.png[{image_attr}]
14+
image::images/1110-01.png[{image_attr}]
15+
16+
....
17+
输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]
18+
输出:[[1,2,null,4],[6],[7]]
19+
....
20+
21+
*示例 2:*
22+
23+
....
24+
输入:root = [1,2,4,null,3], to_delete = [3]
25+
输出:[[1,2,4]]
26+
....
1627

17-
[subs="verbatim,quotes,macros"]
18-
----
19-
*Input:* root = [1,2,3,4,5,6,7], to_delete = [3,5]
20-
*Output:* [[1,2,null,4],[6],[7]]
21-
----
2228

23-
24-
*Constraints:*
29+
*提示:*
2530

31+
* 树中的节点数最大为 `1000`
32+
* 每个节点都有一个介于 `1``1000` 之间的值,且各不相同。
33+
* `+to_delete.length <= 1000+`
34+
* `to_delete` 包含一些从 `1``1000`、各不相同的值。
2635
27-
* The number of nodes in the given tree is at most `1000`.
28-
* Each node has a distinct value between `1` and `1000`.
29-
* `to_delete.length <= 1000`
30-
* `to_delete` contains distinct values between `1` and `1000`.
3136
3237
== 思路分析
3338

34-
利用递归,在“后序遍历”阶段,对当前阶段判断是否需要删除。
3539

3640
[[src-1110]]
41+
[tabs]
42+
====
43+
一刷::
44+
+
45+
--
3746
[{java_src_attr}]
3847
----
3948
include::{sourcedir}/_1110_DeleteNodesAndReturnForest.java[tag=answer]
4049
----
50+
--
51+
52+
二刷::
53+
+
54+
--
55+
[{java_src_attr}]
56+
----
57+
include::{sourcedir}/_1110_DeleteNodesAndReturnForest_2.java[tag=answer]
58+
----
59+
--
60+
====
61+
4162

4263
== 参考资料
4364

44-
. https://leetcode.cn/problems/delete-nodes-and-return-forest/solutions/2286145/shan-dian-cheng-lin-by-leetcode-solution-gy95/[1110. 删点成林 - 官方题解^]
45-
. https://leetcode.cn/problems/delete-nodes-and-return-forest/solutions/2289131/he-shi-ji-lu-da-an-pythonjavacgo-by-endl-lpcd/[1110. 删点成林 - 简洁写法!^]
4665

docs/images/1110-01.png

26.3 KB
Loading

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,11 @@ endif::[]
848848
|{doc_base_url}/1496-path-crossing.adoc[题解]
849849
|✅ 想找个巧办法,结果失败!还是用记录轨迹的办法搞定了。
850850

851+
|{counter:codes2503}
852+
|{leetcode_base_url}/delete-nodes-and-return-forest/[1110. 删点成林^]
853+
|{doc_base_url}/1110-delete-nodes-and-return-forest.adoc[题解]
854+
|✅ 深度优先遍历,把父节点传到递归参数里,同时标注一下是左子树还是右子树。
855+
851856
|===
852857

853858
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import com.diguage.algo.util.TreeNode;
4+
5+
import java.util.*;
6+
7+
public class _1110_DeleteNodesAndReturnForest_2 {
8+
// tag::answer[]
9+
10+
/**
11+
* @author D瓜哥 · https://www.diguage.com
12+
* @since 2025-05-27 21:06:27
13+
*/
14+
public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
15+
Set<Integer> set = new HashSet<>(to_delete.length);
16+
Arrays.stream(to_delete).forEach(set::add);
17+
List<TreeNode> result = new ArrayList<>();
18+
dfs(root, set, result, null, true);
19+
return result;
20+
}
21+
22+
private void dfs(TreeNode node, Set<Integer> set,
23+
List<TreeNode> result, TreeNode parent, boolean left) {
24+
if (node == null) {
25+
return;
26+
}
27+
if (set.contains(node.val)) {
28+
if (parent != null) {
29+
if (left) {
30+
parent.left = null;
31+
} else {
32+
parent.right = null;
33+
}
34+
}
35+
dfs(node.left, set, result, null, true);
36+
dfs(node.right, set, result, null, false);
37+
} else {
38+
if (parent == null) {
39+
result.add(node);
40+
}
41+
dfs(node.left, set, result, node, true);
42+
dfs(node.right, set, result, node, false);
43+
}
44+
}
45+
// end::answer[]
46+
}

0 commit comments

Comments
 (0)