我有一个具有树结构的应用程序,其中每个父节点有3个或更多子节点。每个节点都包含一个整数值。我试图看看树中是否存在给定的整数值。如何在树上进行深度优先搜索?我知道我们从根开始,然后在树的每个分支中尽可能地探索。我在使用Java实现这个问题时遇到了麻烦。我是否需要某种其他数据结构来进行遍历?
如果有人可以提供示例实施,那将会很有帮助。
树结构如下。我需要实现findNode函数:
public class Tree{
public Node{
Node [] children;
int val;
public Node[] getChildren(){
return children;
}
public getVal(int i){
return children[i].val;
}
}
public boolean findNode(int val){
}
}
答案 0 :(得分:2)
迭代:
public boolean findNode(Node node, int value) {
Deque<Node> stack = new ArrayDeque<Node>();
stack.push(node);
while (!stack.isEmpty()) {
Node n = stack.pop();
if (n.getVal() == value)
return true;
for (Node child : n.getChildren())
stack.push(child);
}
return false;
}
递归:
public boolean findNode(Node node, int value) {
if (node.getVal() == value)
return true;
for (Node n : node.getChildren()) {
if (findNode(n, value))
return true;
}
return false;
}
public int getVal() {
return val;
}
您不需要getVal(int i)
方法。 node参数是树的根。
答案 1 :(得分:0)
未经测试,但至少显示算法的结构。如果您想要BFS,只需将Stack
替换为LinkedList
。
public boolean findNodeDFS(Node root, int value) {
Stack<Node> nodes = new Stack<>(){{
add(root);
}};
while (!nodes.isEmpty()) {
Node current = nodes.pop();
if (current.getValue() == value) {
return true;
}
nodes.addAll(Arrays.asList(current.getChildren()));
}
return false;
}