我在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数组)。 这不是家庭作业,我是自学成才))
答案 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=8787521和Java 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);
}
干杯,弗里克