// 简单版
public List<Node> getChildrenById(List<Node> nodes, int parentId) {
List<Node> children = new ArrayList<>();
for (Node node : nodes) {
if (node.getParentId() == parentId) {
children.add(node);
children.addAll(getChildrenById(nodes, node.getId()));
}
}
return children;
}
// 优化版:使用一个visited集合来跟踪已经访问过的节点,防止重复访问
public List<Node> getChildrenById(List<Node> nodes, int parentId, Set<Integer> visited) {
List<Node> children = new ArrayList<>();
for (Node node : nodes) {
if (node.getParentId() == parentId && !visited.contains(node.getId())) {
visited.add(node.getId());
children.add(node);
children.addAll(getChildrenById(nodes, node.getId(), visited));
}
}
return children;
}
// 迭代算法版,使用一个栈来存储待处理的节点,在每次循环中,我们从栈中弹出一个节点,并遍历所有节点,查找其子节点。如果找到了子节点,我们将其添加到子节点列表中,并将其压入栈中,以便后续处理。
public List<Node> getChildrenById(List<Node> nodes, int parentId) {
List<Node> children = new ArrayList<>();
Stack<Node> stack = new Stack<>();
stack.push(new Node(parentId));
while (!stack.isEmpty()) {
Node node = stack.pop();
for (Node child : nodes) {
if (child.getParentId() == node.getId()) {
children.add(child);
stack.push(child);
}
}
}
return children;
}
不管哪个版本都要注意避免循环引用和死循环的问题