public class Solution { public IList<int> KillProcess(IList<int> pid, IList<int> ppid, int kill) { if (kill == 0) { return pid; } int n = pid.Count; Dictionary<int, List<int>> tree = new Dictionary<int, List<int>>(); for (int i = 0; i < n; i++) { tree.Add(pid[i], new List<int>()); } for (int i = 0; i < n; i++) { if (tree.ContainsKey(ppid[i])) { var children = tree[ppid[i]]; children.Add(pid[i]); if (!tree.ContainsKey(ppid[i])) { tree.Add(ppid[i], children); } } } List<int> result = new List<int>(); traverse(tree, result, kill); return result; } private void traverse(Dictionary<int, List<int>> tree, List<int> result, int pid) { result.Add(pid); var children = tree[pid]; foreach (var child in children) { traverse(tree, result, child); } } }
https://leetcode.com/problems/kill-process/#/solutions
tree中记录的是每个进程及其直接的子进程。然后在调用traverse方法,这个方法是递归的进行寻找,每个级别的进程及其子进程,将其全部加入到要删除的进程列表result中。