在Tree中查找节点的路径?

时间:2013-11-27 02:34:40

标签: java tree

我有一个看起来像这样的树类:

Class Tree {
   Node root;
   Node curNode;
   public List<String> find(String value) {
      if (curNode == null) curNode = root;
        for (Node child : curNode.children) {
            if (found == false) {
                if (child.data.equals(value)) {
                    // if it finds it return the path to this node.
                }
                curNode = child;
                findDFS(value);
            }
        }
   }


class Node {
   List<Node> children;
   String data;
}

树根包含指向其他子节点的子节点的指针等等。我遇到的问题是一旦找到节点,我需要返回该节点的路径。

3 个答案:

答案 0 :(得分:9)

传递跟踪路径的列表,一旦找到节点,退出递归并逐个填充路径。

    Boolean Search(Node node, String value, List<Node> track)
    {
        if (node == null) return false;

        if (node.data.equals(value))
        {
            track.add(node);
            return true;
        }

        for(Node child : node.children)
        {
            if (Search(child, value, track)
            {
                track.add(0, node);
                return true;
            }
        }

        return false;
    }

答案 1 :(得分:0)

如果节点仅指向他们的孩子,则需要在下行时跟踪每个路径。正如评论中所提到的,您可以使用自己的堆栈或递归来完成此操作。例如,您总是可以在每个节点的子节点上返回find()调用。

如果节点指向两个方向,则一旦找到正确的节点,就可以轻松地重新跟踪路径。

答案 2 :(得分:0)

以下代码跟踪路径,将节点添加到列表中,如果它们不在路径中,则删除它们

boolean getPath(Node root,String targetValue,List<Integer> path)
{
    // base case root is null so path not available
    if(root==null)
        return false;
    //add the data to the path
    path.add(root.getData());
    //if the root has data return true,path already saved
    if(root.getData().equals(targetValue))
        return true;
    //find the value in all the children
    for(Node child: children){
         if(getPath(child,targetValue,path))
          return true;
    }
    //if this node does not exist in path remove it
    path.remove(path.size()-1);
    return false;
}