java代码树形结构递归返回的结果labelId是id,pid是父id,pid是null是顶级菜单根据labelId查询并返回labelId,多个labelId用,隔开(递归子集的labelId也要返回)
时间: 2024-02-18 10:59:06 浏览: 98
好的,以下是Java代码实现:
```java
import java.util.ArrayList;
import java.util.List;
public class TreeNode {
private int id;
private Integer pid;
private List<TreeNode> children;
public TreeNode(int id, Integer pid) {
this.id = id;
this.pid = pid;
this.children = new ArrayList<>();
}
public int getId() {
return id;
}
public Integer getPid() {
return pid;
}
public List<TreeNode> getChildren() {
return children;
}
public void addChild(TreeNode child) {
children.add(child);
}
public List<Integer> findNodesByLabelId(int labelId) {
List<Integer> result = new ArrayList<>();
if (id == labelId) {
result.add(id);
}
for (TreeNode child : children) {
result.addAll(child.findNodesByLabelId(labelId));
}
return result;
}
public static List<Integer> getLabelIdsByParentId(List<TreeNode> nodes, Integer parentId) {
List<Integer> labelIds = new ArrayList<>();
for (TreeNode node : nodes) {
if (node.getPid() == parentId) {
labelIds.add(node.getId());
labelIds.addAll(getLabelIdsByParentId(nodes, node.getId()));
}
}
return labelIds;
}
public static void main(String[] args) {
List<TreeNode> nodes = new ArrayList<>();
nodes.add(new TreeNode(1, null));
nodes.add(new TreeNode(2, 1));
nodes.add(new TreeNode(3, 2));
nodes.add(new TreeNode(4, 2));
nodes.add(new TreeNode(5, 1));
nodes.add(new TreeNode(6, 5));
nodes.add(new TreeNode(7, 5));
nodes.add(new TreeNode(8, null));
nodes.add(new TreeNode(9, 8));
nodes.add(new TreeNode(10, 8));
List<Integer> labelIds = new ArrayList<>();
for (TreeNode node : nodes) {
if (node.getPid() == null) {
labelIds.add(node.getId());
labelIds.addAll(getLabelIdsByParentId(nodes, node.getId()));
}
}
List<Integer> result = new ArrayList<>();
for (int labelId : labelIds) {
result.addAll(nodes.get(0).findNodesByLabelId(labelId));
}
System.out.println(String.join(", ", result.stream().map(Object::toString).toArray(String[]::new)));
}
}
```
在这段代码中,我们首先定义了一个`TreeNode`类,用于表示树形结构中的节点。该类包含了节点的`id`和`pid`属性,以及子节点列表`children`。其中,`findNodesByLabelId`方法用于查找指定节点及其子节点的`labelId`,`getLabelIdsByParentId`方法用于递归查找指定节点的子节点的`labelId`。最后,我们可以先通过`getLabelIdsByParentId`方法找到所有顶级节点及其子节点的`labelId`,然后再通过`findNodesByLabelId`方法查找这些节点及其子节点的`labelId`。
阅读全文