Skip to content

Commit cafe9ec

Browse files
committed
feat: add solutions to lc problem: No.1273
No.1273.Delete Tree Nodes
1 parent 6f556d1 commit cafe9ec

File tree

8 files changed

+326
-4
lines changed

8 files changed

+326
-4
lines changed

solution/0700-0799/0742.Closest Leaf in a Binary Tree/README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ root = [1,2,3,4,null,null,null,5,null,6], k = 2
7474

7575
<!-- 这里可写通用的实现逻辑 -->
7676

77-
DFS。
77+
DFS 和 BFS。
78+
79+
先通过 DFS 构建图,然后 BFS 找距离值为 k 的结点最近的叶子结点。
7880

7981
<!-- tabs:start -->
8082

solution/0700-0799/0742.Closest Leaf in a Binary Tree/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ Diagram of binary tree:
120120

121121
## Solutions
122122

123-
DFS.
123+
DFS & BFS.
124124

125125
<!-- tabs:start -->
126126

solution/1200-1299/1273.Delete Tree Nodes/README.md

+113-1
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,134 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67+
先构建图。
68+
69+
然后对于树中的每一个节点 u,我们通过深度优先搜索的方法,递归地搜索它的所有子节点 v,计算出以 v 为根的子树的节点数目和权值之和。在这之后,我们将子节点的值分别进行累加,就可以得到以 u 为根的子树的节点数目和权值之和。如果权值之和为零,那么以 u 为根的子树需要被删除,我们将其节点数目也置为零,作为结果返回到上一层。最终根节点 0 对应的节点数目即为答案。
70+
6771
<!-- tabs:start -->
6872

6973
### **Python3**
7074

7175
<!-- 这里可写当前语言的特殊实现逻辑 -->
7276

7377
```python
74-
78+
class Solution:
79+
def deleteTreeNodes(self, nodes: int, parent: List[int], value: List[int]) -> int:
80+
def dfs(u):
81+
for v in g[u]:
82+
dfs(v)
83+
value[u] += value[v]
84+
counter[u] += counter[v]
85+
if value[u] == 0:
86+
counter[u] = 0
87+
88+
g = defaultdict(list)
89+
for i, p in enumerate(parent):
90+
if p != -1:
91+
g[p].append(i)
92+
counter = [1] * nodes
93+
dfs(0)
94+
return counter[0]
7595
```
7696

7797
### **Java**
7898

7999
<!-- 这里可写当前语言的特殊实现逻辑 -->
80100

81101
```java
102+
class Solution {
103+
private Map<Integer, List<Integer>> g;
104+
private int[] counter;
105+
private int[] value;
106+
107+
public int deleteTreeNodes(int nodes, int[] parent, int[] value) {
108+
g = new HashMap<>();
109+
for (int i = 0; i < nodes; ++i) {
110+
if (parent[i] != -1) {
111+
g.computeIfAbsent(parent[i], k -> new ArrayList<>()).add(i);
112+
}
113+
}
114+
this.value = value;
115+
counter = new int[nodes];
116+
Arrays.fill(counter, 1);
117+
dfs(0);
118+
return counter[0];
119+
}
120+
121+
private void dfs(int u) {
122+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
123+
dfs(v);
124+
value[u] += value[v];
125+
counter[u] += counter[v];
126+
}
127+
if (value[u] == 0) {
128+
counter[u] = 0;
129+
}
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
unordered_map<int, vector<int>> g;
140+
vector<int> counter;
141+
vector<int> value;
142+
143+
int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
144+
for (int i = 0; i < nodes; ++i)
145+
if (parent[i] != -1)
146+
g[parent[i]].push_back(i);
147+
counter.resize(nodes, 1);
148+
this->value = value;
149+
dfs(0);
150+
return counter[0];
151+
}
152+
153+
void dfs(int u) {
154+
for (int v : g[u])
155+
{
156+
dfs(v);
157+
value[u] += value[v];
158+
counter[u] += counter[v];
159+
}
160+
if (value[u] == 0) counter[u] = 0;
161+
}
162+
};
163+
```
82164
165+
### **Go**
166+
167+
```go
168+
func deleteTreeNodes(nodes int, parent []int, value []int) int {
169+
g := make(map[int][]int)
170+
for i, p := range parent {
171+
if p != -1 {
172+
g[p] = append(g[p], i)
173+
}
174+
}
175+
counter := make([]int, nodes)
176+
for i := range counter {
177+
counter[i] = 1
178+
}
179+
var dfs func(u int)
180+
dfs = func(u int) {
181+
if vs, ok := g[u]; ok {
182+
for _, v := range vs {
183+
dfs(v)
184+
value[u] += value[v]
185+
counter[u] += counter[v]
186+
}
187+
}
188+
if value[u] == 0 {
189+
counter[u] = 0
190+
}
191+
}
192+
dfs(0)
193+
return counter[0]
194+
}
83195
```
84196

85197
### **...**

solution/1200-1299/1273.Delete Tree Nodes/README_EN.md

+109-1
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,121 @@
6565
### **Python3**
6666

6767
```python
68-
68+
class Solution:
69+
def deleteTreeNodes(self, nodes: int, parent: List[int], value: List[int]) -> int:
70+
def dfs(u):
71+
for v in g[u]:
72+
dfs(v)
73+
value[u] += value[v]
74+
counter[u] += counter[v]
75+
if value[u] == 0:
76+
counter[u] = 0
77+
78+
g = defaultdict(list)
79+
for i, p in enumerate(parent):
80+
if p != -1:
81+
g[p].append(i)
82+
counter = [1] * nodes
83+
dfs(0)
84+
return counter[0]
6985
```
7086

7187
### **Java**
7288

7389
```java
90+
class Solution {
91+
private Map<Integer, List<Integer>> g;
92+
private int[] counter;
93+
private int[] value;
94+
95+
public int deleteTreeNodes(int nodes, int[] parent, int[] value) {
96+
g = new HashMap<>();
97+
for (int i = 0; i < nodes; ++i) {
98+
if (parent[i] != -1) {
99+
g.computeIfAbsent(parent[i], k -> new ArrayList<>()).add(i);
100+
}
101+
}
102+
this.value = value;
103+
counter = new int[nodes];
104+
Arrays.fill(counter, 1);
105+
dfs(0);
106+
return counter[0];
107+
}
108+
109+
private void dfs(int u) {
110+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
111+
dfs(v);
112+
value[u] += value[v];
113+
counter[u] += counter[v];
114+
}
115+
if (value[u] == 0) {
116+
counter[u] = 0;
117+
}
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
unordered_map<int, vector<int>> g;
128+
vector<int> counter;
129+
vector<int> value;
130+
131+
int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
132+
for (int i = 0; i < nodes; ++i)
133+
if (parent[i] != -1)
134+
g[parent[i]].push_back(i);
135+
counter.resize(nodes, 1);
136+
this->value = value;
137+
dfs(0);
138+
return counter[0];
139+
}
140+
141+
void dfs(int u) {
142+
for (int v : g[u])
143+
{
144+
dfs(v);
145+
value[u] += value[v];
146+
counter[u] += counter[v];
147+
}
148+
if (value[u] == 0) counter[u] = 0;
149+
}
150+
};
151+
```
74152
153+
### **Go**
154+
155+
```go
156+
func deleteTreeNodes(nodes int, parent []int, value []int) int {
157+
g := make(map[int][]int)
158+
for i, p := range parent {
159+
if p != -1 {
160+
g[p] = append(g[p], i)
161+
}
162+
}
163+
counter := make([]int, nodes)
164+
for i := range counter {
165+
counter[i] = 1
166+
}
167+
var dfs func(u int)
168+
dfs = func(u int) {
169+
if vs, ok := g[u]; ok {
170+
for _, v := range vs {
171+
dfs(v)
172+
value[u] += value[v]
173+
counter[u] += counter[v]
174+
}
175+
}
176+
if value[u] == 0 {
177+
counter[u] = 0
178+
}
179+
}
180+
dfs(0)
181+
return counter[0]
182+
}
75183
```
76184

77185
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
unordered_map<int, vector<int>> g;
4+
vector<int> counter;
5+
vector<int> value;
6+
7+
int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
8+
for (int i = 0; i < nodes; ++i)
9+
if (parent[i] != -1)
10+
g[parent[i]].push_back(i);
11+
counter.resize(nodes, 1);
12+
this->value = value;
13+
dfs(0);
14+
return counter[0];
15+
}
16+
17+
void dfs(int u) {
18+
for (int v : g[u])
19+
{
20+
dfs(v);
21+
value[u] += value[v];
22+
counter[u] += counter[v];
23+
}
24+
if (value[u] == 0) counter[u] = 0;
25+
}
26+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func deleteTreeNodes(nodes int, parent []int, value []int) int {
2+
g := make(map[int][]int)
3+
for i, p := range parent {
4+
if p != -1 {
5+
g[p] = append(g[p], i)
6+
}
7+
}
8+
counter := make([]int, nodes)
9+
for i := range counter {
10+
counter[i] = 1
11+
}
12+
var dfs func(u int)
13+
dfs = func(u int) {
14+
if vs, ok := g[u]; ok {
15+
for _, v := range vs {
16+
dfs(v)
17+
value[u] += value[v]
18+
counter[u] += counter[v]
19+
}
20+
}
21+
if value[u] == 0 {
22+
counter[u] = 0
23+
}
24+
}
25+
dfs(0)
26+
return counter[0]
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
private Map<Integer, List<Integer>> g;
3+
private int[] counter;
4+
private int[] value;
5+
6+
public int deleteTreeNodes(int nodes, int[] parent, int[] value) {
7+
g = new HashMap<>();
8+
for (int i = 0; i < nodes; ++i) {
9+
if (parent[i] != -1) {
10+
g.computeIfAbsent(parent[i], k -> new ArrayList<>()).add(i);
11+
}
12+
}
13+
this.value = value;
14+
counter = new int[nodes];
15+
Arrays.fill(counter, 1);
16+
dfs(0);
17+
return counter[0];
18+
}
19+
20+
private void dfs(int u) {
21+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
22+
dfs(v);
23+
value[u] += value[v];
24+
counter[u] += counter[v];
25+
}
26+
if (value[u] == 0) {
27+
counter[u] = 0;
28+
}
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def deleteTreeNodes(self, nodes: int, parent: List[int], value: List[int]) -> int:
3+
def dfs(u):
4+
for v in g[u]:
5+
dfs(v)
6+
value[u] += value[v]
7+
counter[u] += counter[v]
8+
if value[u] == 0:
9+
counter[u] = 0
10+
11+
g = defaultdict(list)
12+
for i, p in enumerate(parent):
13+
if p != -1:
14+
g[p].append(i)
15+
counter = [1] * nodes
16+
dfs(0)
17+
return counter[0]

0 commit comments

Comments
 (0)