基于阵列的Trie实现。子数组中的非null值

时间:2016-12-06 19:34:38

标签: java data-structures trie

我试图从http://www.programcreek.com/2014/05/leetcode-implement-trie-prefix-tree-java/了解基于数组的Trie实现(参见Java解决方案2 - 使用数组提高性能)。

public void insert(String word) {
    TrieNode p = root;
    for(int i = 0; i < word.length(); i++) {
        char c = word.charAt(i);
        int index = c - 'a';
        if(p.arr[index] == null) {
            TrieNode temp = new TrieNode();
            p.arr[index] = temp;
            p = temp;
        } else {
            p = p.arr[index];
        }
    }
    p.isEnd = true;
}

我不确定else分支是否曾被执行过。我错过了什么?

更新1

给定的单词只包含小写英文字母

2 个答案:

答案 0 :(得分:2)

第一次调用此函数时,else分支确实不会执行。但是,随着Trie的填充,p.arr[index]很可能不为空。

例如,调用insert("i")将导致在root.arr['i' - 'a']添加新的TrieNode。第二次调用该函数(例如使用insert("it"))会导致检查p.arr[index] == null返回false,因为第一个插入已在根节点处为TrieNode添加了i

您可以使用以下主函数对其进行测试(并在else分支中放置断点或println语句)

public static void main (String[] args)
{
    Trie t = new Trie();
    t.insert("i");
    t.insert("it");
}

答案 1 :(得分:1)

这对我来说非常像一个错误。如果c-'a'> 26,则p.arr [index]将不为null,但会引发ArrayIndexOutOfBounds异常。