这道题虽然形式上是树,其实用不到树的相关知识。因为是新题,还不知道以后有没有人写出更快的算法。这里参考答案中的C++代码。
首先要知道,map和set是STL中很有用的数据结构,但是平时用的不多所以不熟悉。map是红黑树实现的,可以定义key与value的一一对应关系,它查找的复杂度仅为O(log n),插入、删除操作都很快。set同样使用红黑树实现,插入、删除都很快,并且会自动排序。使用set和map可以大大降低算法复杂度。
这道题我们先梳理一下数据,用set来存储每一个节点的子节点,然后用map让set与每一个节点对应起来。然后用DFS或BFS都可以。这里给出DFS的做法。
class Solution {
public:
vector<int> killProcess(vector<int>& pid, vector<int>& ppid, int kill) {
vector<int> killed;
map<int, set<int>> children;
for (int i = 0; i < pid.size(); i++) {
children[ppid[i]].insert(pid[i]);
}
queue<int> q;
q.push(kill);
while (!q.empty()) {
int p = q.front(); q.pop();
killed.push_back(p);
for (int child : children[p]) {
q.push(child);
}
}
return killed;
}
};