以递归方式遍历树的第一个问题

时间:2012-03-15 16:53:49

标签: java recursion tree antlr

我正在尝试使用ANTLR树命令和递归遍历树。我目前的代码是:

public void traverseTree(Tree tree){
        int counter = 0;
        System.out.println(tree.toString());
        if (tree.getChildCount() > 0 && tree.getChild(0) != null){
            System.out.println(tree.toString() + counter++);
            tree = tree.getChild(0);
            traverseTree(tree);

        }
        while (tree.getParent().getChild(tree.getChildIndex() + 1) != null){
            System.out.println(tree.toString() + counter++);
            tree = tree.getParent().getChild(tree.getChildIndex() + 1);
            traverseTree(tree);

        }
    }

但是,它没有用。我在树中获得了很多条目,但没有明显的顺序。谁能看到我哪里出错?

感谢。

编辑:

我在下面做的评论应该是从这里开始的:

抱歉,我应该删除打印语句,他们只是在那里尝试调试它。我遇到的问题是它应该只搜索它开始的节点和该节点的任何兄弟节点,它不应该上升到一个级别,但确实如此,它会打印所有内容。 (我会把它编辑成主要内容,应该一直在那里开始,抱歉)。

我设法让代码最终正常工作:

public void traverseTree(Tree tree){
        System.out.println(tree);
        if (tree.getChild(0) != null){
            traverseTree(tree.getChild(0));
        }
        if(tree.getParent().getChildCount() > 1){
            if(tree.getParent().getChild(tree.getChildIndex() + 1) != null)
            traverseTree(tree.getParent().getChild(tree.getChildIndex() + 1));
        }
    }

3 个答案:

答案 0 :(得分:5)

确保它永远不会升级的最简单方法是确保您永远不会致电getParent()。如果你不知道有一个上层,你就不能去那里。

public void traverseTree(Tree tree) {

    // print, increment counter, whatever
    System.out.println(tree.toString());

    // traverse children
    int childCount = tree.getChildCount();
    if (childCount == 0) {
        // leaf node, we're done
    } else {
        for (int i = 0; i < childCount; i++) {
            Tree child = tree.getChild(i);
            traverseTree(child);
        }
    }
}

递归的全部意义在于你不需要重新开始。当此级别的traverseTree()结束时,上一级别的循环将继续到下一个级别。

(请注意if实际上并不是必需的,除非你想要在到达叶子节点时做一些特别的事情。我只是把它放在那里,这样评论就会明白发生了什么。从概念上讲,通过弄清楚如何知道何时停止递归来开始递归总是一个好主意。)

答案 1 :(得分:2)

看起来你要多次打印出相同的节点。如果您只是想在打印时打印出节点,

   1
 2   3
4 5   6

Depth first - 1 2 4 5 3 6
Breadth first - 1 2 3 4 5 6

//For depth first
public void traverseTree(Tree tree){        
    System.out.println(tree.toString());
    for (int x = 0; x < tree.getChildCount(); x++)
        traverseTree(tree.getChild(x));
}

要切换到4 5 6 2 3 1,只需将println移动到for循环之后。

答案 2 :(得分:0)

试试这个:

int counter = 0;
public void traverseTree(Tree tree) {

    for (int i=0; i<tree.getChildCount(); i++) {
        Tree child = tree.getChild(i);
        System.out.println(tree.toString() + counter++);
        traverseTree(tree);
    }
}