我已经实现了一个能够存储数据的通用trie,但我的问题在于从trie中提取它。这是我的Trie和TrieNode类,以及我的getWords()方法:
public class Trie<T extends Comparable<T>>
{
private TrieNode root;
List<String> wordList = new ArrayList<String>();
StringBuilder word = new StringBuilder();
public Trie()
{
root = new TrieNode((T) " ");
}
private class TrieNode implements Comparable
{
private T data;
private int count;
private boolean end;
private List<TrieNode> children; //subnodes
private TrieNode(T data)
{
this.data = data;
count = 0;
end = false;
children = new ArrayList<TrieNode>();
}
}
public List<String> getWords(Trie<T> t) throws Exception
{
List<String> words = getWords(t.root);
return words;
}
private List<String> getWords(TrieNode node) throws Exception
{
if(node.data.equals(" "))
{
if(node.children.size() > 0)
{
for(TrieNode x : node.children)
return getWords(x);
return wordList;
}
else
throw new Exception("Root has no children");
}
else if(node.children.size() > 0 && node.end == false)
{
word.append(node.data);
for(TrieNode x : node.children)
return getWords(x);
}
else if(node.children.size() == 0 && node.end == true)
{
word.append(node.data);
wordList.add(word.toString());
}
return null;
}
}
我正在使用我的主要类中的以下代码进行测试:
Trie<String> a = new Trie<String>();
String[] word = "Steve".split("");
a.insert(word);
System.out.println(a.search(word)); //it can find the word in the trie
System.out.println(a.getWords(a)); //but returns null when traversing through it
,输出为:
true
null
我的代码有什么问题,它无法通过trie正确遍历以提取存储在其中的单词?
答案 0 :(得分:1)
您的getWords(TrieNode)
实施正在提前返回:
// ...
else if(node.children.size() > 0 && node.end == false)
{
word.append(node.data);
for(TrieNode x : node.children)
return getWords(x); // here
}
// ...
return
行在第一次迭代时打破for
循环,返回getWords(x)
表示第一个x
。一个可能的修复(我不确定我完全理解getWords
逻辑上要返回的内容):
// ...
else if(node.children.size() > 0 && node.end == false)
{
word.append(node.data);
List<String> toReturn = new ArrayList<String>();
for(TrieNode x : node.children) {
toReturn.addAll(getWords(x));
}
return toReturn;
}
// ...