【问题标题】:recursive word trie traversal递归词 trie 遍历
【发布时间】:2013-01-01 23:31:45
【问题描述】:

我在这里 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 用于单词 yard 和 yellow(传递 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 中所有单词的递归打印方法(以及更好的方法 - 返回字符串数组)。 这不是家庭作业,我是自学的))

【问题讨论】:

    标签: java traversal trie


    【解决方案1】:

    您能否分享更多您的代码和输入数据,以便更好地了解您想要做什么?

    关于 Java 中的 Trie 数据结构 的 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);
    }
    

    干杯,弗里克

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2016-06-02
    • 2019-08-03
    • 2015-05-11
    相关资源
    最近更新 更多