Cho cây gốc tại nút 0 với: số nút nodes, giá trị nút i là value[i], cha của nút i là parent[i]. Xóa mọi cây con có tổng giá trị = 0. Trả về số nút còn lại.
Ví dụ: 7 nút, kết quả = 2.
Giải thuật (DFS pós-order)
- Xây dựng đồ thị con
childrentừ mảngparent. - Hàm
dfs(node)trả về cặp(tổng giá trị, số nút)của cây con. - Khởi tạo
temp = (value[node], 1). - Duyệt con: cộng dồn kết quả
dfs(con)vàotemp. - Nếu
temp.first == 0: trừtemp.secondkhỏi đáp án toàn cụcans, đặttemp.second = 0. - Trả về
temp. - Main:
ans = n, xây đồ thị, gọidfs(0), trả vềans.
Ví dụ C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
map<int, int> children;
int ans;
pair<int, int> dfs(int node, vector<int>& value, vector<int> graph[]) {
pair<int, int> temp = {value[node], 1};
for(int i = 0; i < graph[node].size(); i++) {
pair<int, int> temp2 = dfs(graph[node][i], value, graph);
temp.first += temp2.first;
temp.second += temp2.second;
}
if(temp.first == 0) {
ans -= temp.second;
temp.second = 0;
}
return temp;
}
int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
int n = value.size(); ans = n; children.clear();
vector<int> graph[n + 1];
for(int i = 1; i < n; i++) graph[parent[i]].push_back(i);
dfs(0, value, graph);
return ans;
}
};
int main() {
vector<int> v1 = {-1,0,0,1,2,2,2};
vector<int> v2 = {1,-2,4,0,-2,-1,-1};
Solution ob;
cout << (ob.deleteTreeNodes(7, v1, v2));
return 0;
}
Đầu vào
7 [-1,0,0,1,2,2,2] [1,-2,4,0,-2,-1,-1]
Đầu ra
2