递归词trie遍历

时间:2013-01-18 09:24:31

标签: java traversal trie

我在Traversing a trie to get all words找到了同样的问题,但它适用于Perl,我只熟悉Java。 我的trie结构是普通整数数组,其中前26个整数是根,每个整数都有firstChild索引,它是子数组元素的索引(最多25个最高位),列表结束位标志,字结束位标志,字母索引从1到26(最低5位)。 如果我将2(字母c的根索引)作为参数传递,我可以递归地打印一个单词CAGE

private void oneWord(int node) {
        System.out.print(getChar(Trie[node]));
        if (getEOL(Trie[node]) != 1) {
            oneWord(getFirstChild(Trie[node]));
        }
    } 

或常见的开头和不同的结尾,例如YARDELLOW,用于单词码和黄色(将24作为参数传递)

private void DFTSearch(int node) {
    System.out.print(getChar(Trie[node]));
    if (getFirstChild(Trie[node]) != 0) {
        for (int i = 0; i < getSiblingsNum((getFirstChild(Trie[node])); i++) {
            DFTSearch(getFirstChild(Trie[node]) + i);
        }
    }
}

但不能用所有的话来做((我已经尝试了这个,并使其返回一个字符串,并没有取得任何成功(只是得到一个字符串的第一个字母。 请帮助我的trie中所有单词的递归打印方法(以及更好的方法 - 返回String数组)。 这不是家庭作业,我是自学成才))

1 个答案:

答案 0 :(得分:1)

您是否可以分享更多的代码和输入数据,以便更好地了解您的目标?

有关 Trie数据结构(Java)的Stack Overflow讨论可能会有所帮助:Trie data structures - Java。我发现以下链接(来自其中一个答案)非常有用:https://forums.oracle.com/forums/thread.jspa?messageID=8787521

编辑:在https://forums.oracle.com/forums/thread.jspa?messageID=8787521Java tree data-structure?的帮助下,我创建了以下代码:

public Stack<List<Character>> createTreeAndGetAllWords() {
    // Create the tree.
    final Tree<Character> rootTree = new Tree<Character>('*');
    final Tree<Character> cTree = rootTree.addChild(new Tree<Character>('c'));
    final Tree<Character> aTree = cTree.addChild(new Tree<Character>('a'));
    aTree.addChild(new Tree<Character>('r'));
    aTree.addChild(new Tree<Character>('t'));
    final Tree<Character> dTree = rootTree.addChild(new Tree<Character>('d'));
    final Tree<Character> oTree = dTree.addChild(new Tree<Character>('o'));
    oTree.addChild(new Tree<Character>('g'));
    // Traverse the tree.
    return getAllWords(rootTree);
}

private Stack<List<Character>> getAllWords(final Tree<Character> tree) {
    final Stack<List<Character>> listStack = new Stack<List<Character>>();
    for (final Tree<Character> child : tree.getChildren()) {
        listStack.push(new ArrayList<Character>());
        traverseSubtree(child, listStack);
    }
    return listStack;
}

private void traverseSubtree(final Tree<Character> tree, final Stack<List<Character>> listStack) {
    final List<Character> currentWord = listStack.pop();
    if (tree.hasChildren()) {
        for (final Tree<Character> child : tree.getChildren()) {
            final List<Character> extendedWord = new ArrayList<Character>(currentWord);
            extendedWord.add(tree.getValue());
            listStack.push(extendedWord);
            traverseSubtree(child, listStack);
        }
    } else {
        currentWord.add(tree.getValue());
        listStack.push(currentWord);
    }
}



public class Tree<T> {
    private T value;
    private List<Tree<T>> children;

    public Tree(T value) {
        this.value = value;
        this.children = new ArrayList<Tree<T>>();
    }

    public T getValue() {
        return value;
    }

    public boolean hasChildren() {
        return children.size() > 0;
    }

    public Tree<T> addChild(Tree<T> child) {
        children.add(child);
        return child;
    }

    public List<Tree<T>> getChildren() {
        return children;
    }
}

当我调用createTreeAndGetAllWords时,它会返回我预期的三个字符列表:[c,a,r],[c,a,t]和[d,o,g]。

for (final List<Character> word : createTreeAndGetAllWords()) {
    System.out.println("word = " + word);
}

干杯,弗里克