题目描述: 给 n 个进程,每个进程都有一个独一无二的 PID (进程编号)和它的 PPID (父进程编号)。
每一个进程只有一个父进程,但是每个进程可能会有一个或者多个孩子进程。它们形成的关系就像一个树状结构。只有一个进程的 PPID 是 0 ,意味着这个进程没有父进程。所有的 PID 都会是唯一的正整数。
我们用两个序列来表示这些进程,第一个序列包含所有进程的 PID ,第二个序列包含所有进程对应的 PPID。
现在给定这两个序列和一个 PID 表示你要杀死的进程,函数返回一个 PID 序列,表示因为杀这个进程而导致的所有被杀掉的进程的编号。
当一个进程被杀掉的时候,它所有的孩子进程和后代进程都要被杀掉。
你可以以任意顺序排列返回的 PID 序列。
示例 1: 输入: pid = [1, 3, 10, 5] ppid = [3, 0, 5, 3] kill = 5 输出: [5,10] 解释: 杀掉进程 5 ,同时它的后代进程 10 也被杀掉。
注意: 被杀掉的进程编号一定在 PID 序列中。 n >= 1.
方法1: 主要思路: (1)先将线程之间的父子关系使用哈希进行统计; (2)使用类似的广度优先的思路,直接对存储结果的数组边遍历,边插入新的结点,知道遍历到结点的尾部;
class Solution { public: vector<int> killProcess(vector<int>& pid, vector<int>& ppid, int kill) { unordered_map<int,vector<int>> mp; //统计父子之间的关系 for(int i=0;i<pid.size();++i){ mp[ppid[i]].push_back(pid[i]); } vector<int>res; res.push_back(kill);//存储结果,初始值 int pos=0;//遍历存储结果的数组 //直到遍历结束 while(pos<res.size()){ //若当前遍历的结点存在子节点,则将所有的子节点压入到结果中 if(mp.count(res[pos])){ for(int&n:mp[res[pos]]){ res.push_back(n); } } ++pos;//要判断的下一个元素的索引 } return res; } };