我正在尝试实现一种方法,该方法会将Trie中的所有单词添加到列表中。我正在使用Hashmap来存储子节点的字符和参考节点。字符只能包含字母a-z。这是我对节点的实现:
class Node {
char c;
HashMap<Character, Node> children = new HashMap<>();
boolean isCompleteWord;
public Node(char c){
this.c = c;
isCompleteWord = false;
}
public Node(){}
}
我不太确定从哪里开始,叶子节点将能够告诉我单词是否完整,因此我可以遍历Trie直到到达叶子节点并将字符附加到字符串上也许吧,但是一旦添加了这个词,我该如何遍历特里的不同分支来添加其他词?
答案 0 :(得分:0)
第一件事。实际上,您实际上不需要在节点类中存储一个字符属性,因为它已经隐式存储在其父节点的children
属性中。
因此,您的Node类实际上可以是:
class Node {
HashMap<Character, Node> children = new HashMap<>();
boolean isCompleteWord;
public Node(){
isCompleteWord = false;
}
}
此外,像所有有根树一样,您的Trie也需要有根。在您的Trie中存储任何单词之前,您将需要一个词根。
root = new Node();
根节点代表空字符串,因此,如果需要存储它,则必须检查isCompleteWord
的{{1}}属性。
然后,要插入一个单词,例如myWord,您需要从词根开始,并应用以下规则:
-考虑第一个字母myWord [0],例如root
。您需要区分两种情况,即root是否包含键“ c”。如果不包含单词,则需要在Trie中创建一个新节点。否则,您只需要继续沿着分支“行走”即可。
-到达最后一个字母后,只需将属性'c'
设置为isCompleteWord
。这是true
的一种可能的(完全未经测试的)实现,它在Trie中添加了一个单词,如果已经存在,则返回addWord
,否则返回true
。
false
要在Trie中添加一个单词,例如说public bool addWord(Node node, String word, int idx){
if (idx == word.length() -1){
// we're checking the last letter
bool result = node.isCompleteWord;
node.isCompleteWord = true;
return result;
} else {
if (!node.children.containsKey(word.charAt(idx)){
// no child with this letter, create one
child = new Node()
node.children.put(word.charAt(idx), child);
}
return addWord(node.children(word.charAt(idx)), word, idx+1);
}
}
,只需按以下方式调用它即可:
myWord
检查单词是否存储在trie中的功能与添加单词的功能非常相似。
addWord(root, myWord, 0);