import java.util.HashMap; import java.util.Map; public class TreePathFinder { private Map<String, Node> nodeMap; public TreePathFinder() { nodeMap = new HashMap<>(); } public void addNode(Node node) { nodeMap.put(node.getId(), node); } public String findPath(String nodeId) { Node node = nodeMap.get(nodeId); if (node == null) { return null; } StringBuilder path = new StringBuilder(node.getName()); while (node.getParentId() != null) { Node curNode = new Node(node.getId(), node.getName(), node.getParentId()); node = nodeMap.get(node.getParentId()); node.setChildNode(curNode); if (node != null) { path.insert(0, node.getName() + " > "); } } return node.toString(); } public static void main(String[] args) { TreePathFinder pathFinder = new TreePathFinder(); // 构建树状结构的示例数据 Node node1 = new Node("1", "Root", null); Node node2 = new Node("2", "Node 2", "1"); Node node3 = new Node("3", "Node 3", "1"); Node node4 = new Node("4", "Node 4", "1"); Node node5 = new Node("5", "Node 5", "2"); Node node6 = new Node("6", "Node 6", "2"); Node node7 = new Node("7", "Node 7", "3"); Node node8 = new Node("8", "Node 8", "4"); pathFinder.addNode(node1); pathFinder.addNode(node2); pathFinder.addNode(node3); pathFinder.addNode(node4); pathFinder.addNode(node5); pathFinder.addNode(node6); pathFinder.addNode(node7); pathFinder.addNode(node8); // 获取节点在树上的路径 String path = pathFinder.findPath("5"); System.out.println("Path: " + path); } } 这段代码怎么优化,我现在无法把输入的节点也放在返回的最里层
时间: 2024-03-10 18:49:21 浏览: 99
决策树java代码实现.docx
这段代码可以优化的地方有:
1. 在 `findPath` 方法中,可以使用 `StringBuilder` 的 `reverse()` 方法来避免在后面再次反转路径字符串。
2. 在 `while` 循环中,可以将节点的创建和添加操作移动到循环之前,避免重复创建节点。
3. 在 `Node` 类中,可以添加一个 `toString()` 方法,来方便地输出节点信息。
下面是经过优化后的代码:
```
import java.util.HashMap;
import java.util.Map;
public class TreePathFinder {
private Map<String, Node> nodeMap;
public TreePathFinder() {
nodeMap = new HashMap<>();
}
public void addNode(Node node) {
nodeMap.put(node.getId(), node);
}
public String findPath(String nodeId) {
Node node = nodeMap.get(nodeId);
if (node == null) {
return null;
}
Node curNode = node;
StringBuilder path = new StringBuilder(curNode.getName());
while (curNode.getParentId() != null) {
curNode = nodeMap.get(curNode.getParentId());
curNode.setChildNode(node);
path.insert(0, " > " + curNode.getName());
}
return node.toString() + path.toString();
}
public static void main(String[] args) {
TreePathFinder pathFinder = new TreePathFinder();
// 构建树状结构的示例数据
Node node1 = new Node("1", "Root", null);
Node node2 = new Node("2", "Node 2", "1");
Node node3 = new Node("3", "Node 3", "1");
Node node4 = new Node("4", "Node 4", "1");
Node node5 = new Node("5", "Node 5", "2");
Node node6 = new Node("6", "Node 6", "2");
Node node7 = new Node("7", "Node 7", "3");
Node node8 = new Node("8", "Node 8", "4");
pathFinder.addNode(node1);
pathFinder.addNode(node2);
pathFinder.addNode(node3);
pathFinder.addNode(node4);
pathFinder.addNode(node5);
pathFinder.addNode(node6);
pathFinder.addNode(node7);
pathFinder.addNode(node8);
// 获取节点在树上的路径
String path = pathFinder.findPath("5");
System.out.println("Path: " + path);
}
}
class Node {
private String id;
private String name;
private String parentId;
private Node childNode;
public Node(String id, String name, String parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.childNode = null;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getParentId() {
return parentId;
}
public Node getChildNode() {
return childNode;
}
public void setChildNode(Node childNode) {
this.childNode = childNode;
}
@Override
public String toString() {
return this.getName() + " > ";
}
}
```
在优化后的代码中,`findPath` 方法返回的路径字符串包含了输入节点所在的最里层节点。
阅读全文