如何在图表中以DFS方式打印路径?

时间:2016-11-06 12:36:59

标签: java algorithm graph tree stack

我有一棵树(不是二叉树),我希望从根节点到所有叶子获取路径。 例如;

    A
  / | \ 
 B  C  D
/ \ | / \
E F G H I

我想获得所有路径= {[A,B,E],[A,B,F],[A,C,G],[A,D,H], [A,D,I]}

到目前为止我所做的是;

我有一个Graph类;

public class Graph {
    static class Node{
       String name;
       HashSet<Edge> inEdges;
       HashSet<Edge> outEdges;}
    static class Edge{
       Node from;
       Node to;
       String id;} 
}    

我用这个片段遍历树;

void printAllPaths(rootNode, list) {
    System.out.println(rootNode.name);
    list.add(rootNode.name);
    int childCount = rootNode.outEdges.size();
    if (childCount == 0) {
        System.out.println(list);
        list.pop();//one for node
        list.pop();//one for edge
    } else {
        for (Graph.Edge e : rootNode.outEdges) {
            System.out.println(e.id);
            list.add(e.id);
            printAllPaths(e.to, list, rootNodeReplica);
        }
    }
}

我基本上做的是;

  • 将Node和Edge添加到堆栈
  • 如果节点有子节点,请执行与上面相同的操作
  • 如果节点是叶子,则打印列表/堆栈并从列表/堆栈中弹出节点

然而; 当算法完成B节点分支并移动到C;列表仍保留{A Edge B},但是当更改分支时,它应该只包含节点A.这样我的路径就变成了; 边缘B边缘C边缘G 边缘C边缘G

我该如何解决这个问题? 提前致谢 亲切的问候

1 个答案:

答案 0 :(得分:-1)

让我们看看问题的简单版本。说,我们给定一个链A -- B -- E。我们打印以下三角形。

A
A B
A B C
A B C
A B
A

我们可以使用递归吗?当然可以!

void printEachPath(currentRoot, stack) {
    if (currentRoot == null) return;

    stack.push(currentRoot.name);
    print stack;

    printEachPath(currentRoot->next, stack);

    print stack; 
    stack.pop(currentRoot.name);
}

我希望你能得到一些暗示。