用Java收集Trie中的所有单词

时间:2019-03-14 18:30:32

标签: java data-structures trie

我正在尝试实现一种方法,该方法会将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直到到达叶子节点并将字符附加到字符串上也许吧,但是一旦添加了这个词,我该如何遍历特里的不同分支来添加其他词?

1 个答案:

答案 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);