假设您的树是DAG(有向无环树),例如使用 DFS 或 BFS。这是一个简单的 BFS:
public NodeBase findEmployee (NodeBase root, Integer employeeId) {
Queue<NodeBase> q= new LinkedList<NodeBase>();
q.add(root);
while (!q.isEmpty()) {
NodeBase node= q.poll();
if (node instanceof Employee) {
if (((Employee)node).getId().equals(employeeId))
return node;
}
for (NodeBase child : node.getChildren())
q.add(child);
}
}
}
编辑:访客模式
或者正如Brabster建议的那样,您可以使用访问者模式。ANodeBase
应该实现一个accept(IVisitor visitor)
方法:
public class NodeBase {
//your code
public void accept(IVisitor visitor) {
visitor.visit(this);
for (NodeBase node : getChildren()) {
node.accept(visitor);
}
}
}
IVisitor 只是一个接口:
public interface IVisitor {
public void visit(NodeBase node);
}
您需要一个适当的实现来进行搜索:
public class SearchVisitor implements IVisitor {
private Integer searchId;
public SearchVisitor(Integer searchId) {
this.searchId= searchId;
}
@Override
public void visit(NodeBase node) {
if (node instanceof Employee) {
if (((Employee)node).getId().equals(searchId)) {
System.out.println("Found the node " + node.toString() + "!");
}
}
}
}
现在,您只需简单地调用它:
NodeBase root= getRoot();
root.accept(new SearchVisitor(getSearchId()));