我有一个看起来像这样的树类:
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;
}
树根包含指向其他子节点的子节点的指针等等。我遇到的问题是一旦找到节点,我需要返回该节点的路径。
答案 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;
}