根据id 返回树形结构 用java完成
时间: 2024-02-28 13:55:35 浏览: 19
好的,我来用 Java 实现一遍。同样的,这里也假设我们有一个树形结构的定义:
```java
public class TreeNode {
public int id;
public String name;
public List<TreeNode> children;
public TreeNode(int id, String name) {
this.id = id;
this.name = name;
this.children = new ArrayList<>();
}
}
```
其中,id 和 name 分别表示节点的 ID 和名称,children 表示该节点的子节点列表。
接下来,我们可以定义一个函数,根据 ID 返回树形结构。同样的,我们可以使用递归的方式来实现:
```java
public static TreeNode getTreeNodeById(TreeNode node, int id) {
if (node.id == id) {
return node;
}
for (TreeNode child : node.children) {
TreeNode result = getTreeNodeById(child, id);
if (result != null) {
return result;
}
}
return null;
}
```
这个函数接受两个参数,一个是当前节点 node,另一个是目标节点的 ID id。首先判断当前节点是否为目标节点,如果是,则直接返回该节点。否则,遍历当前节点的子节点列表,递归调用该函数。如果在子节点中找到了目标节点,则返回该节点,否则返回 null。
有了这个函数,我们可以根据任意一个节点的 ID 来获取整个树形结构:
```java
public static TreeNode getTreeById(TreeNode root, int rootId) {
TreeNode rootNode = getTreeNodeById(root, rootId);
if (rootNode == null) {
return null;
}
return buildTree(rootNode);
}
private static TreeNode buildTree(TreeNode node) {
TreeNode treeNode = new TreeNode(node.id, node.name);
for (TreeNode child : node.children) {
TreeNode childNode = buildTree(child);
if (childNode != null) {
treeNode.children.add(childNode);
}
}
return treeNode;
}
```
这个函数接受一个根节点 root 和一个根节点的 ID rootId,首先使用 getTreeNodeById 函数获取根节点,如果找不到,则返回 null。然后,定义一个私有函数 buildTree,用于递归构建树形结构。buildTree 函数接受一个节点 node,返回一个树形结构中对应的节点。
在 buildTree 函数中,首先创建一个与当前节点对应的树形结构节点 treeNode,然后遍历当前节点的子节点列表,递归调用 buildTree 函数,将返回的子节点添加到 treeNode 的 children 列表中。最后返回 treeNode。
使用这个函数,我们可以根据任意一个节点的 ID 来获取整个树形结构。例如,假设我们有以下的树形结构:
```
1
├── 2
│ ├── 3
│ └── 4
├── 5
│ ├── 6
│ └── 7
└── 8
```
我们可以使用以下代码来获取 ID 为 5 的子树:
```java
TreeNode root = new TreeNode(1, "root");
TreeNode node2 = new TreeNode(2, "node2");
TreeNode node3 = new TreeNode(3, "node3");
TreeNode node4 = new TreeNode(4, "node4");
TreeNode node5 = new TreeNode(5, "node5");
TreeNode node6 = new TreeNode(6, "node6");
TreeNode node7 = new TreeNode(7, "node7");
TreeNode node8 = new TreeNode(8, "node8");
node2.children.add(node3);
node2.children.add(node4);
node5.children.add(node6);
node5.children.add(node7);
root.children.add(node2);
root.children.add(node5);
root.children.add(node8);
TreeNode subtree = getTreeById(root, 5);
```
得到的子树应该如下所示:
```
5
├── 6
└── 7
```