深入搜索Java中具有2个以上子节点的树

时间:2013-09-29 18:19:15

标签: java tree depth-first-search

我有一个具有树结构的应用程序,其中每个父节点有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){


    }

}

2 个答案:

答案 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;
}