试图在java中实现trie数据结构

时间:2013-05-12 02:29:51

标签: java data-structures trie

我正在尝试创建一个TrieNode类。每个节点都有一个字母,链接(它连接到的其他节点),一个布尔值声明该节点是否标记完整单词的结尾,我试图添加另一个布尔说天气它是有效前缀的一部分。我遇到问题的部分是前缀部分。我正在尝试制作一个isValidPrefix方法。

我的TrieNode课程:

class TrieNode
{
    char letter;
    TrieNode[] links;
    boolean fullWord;
    boolean validPrefix;

    TrieNode(char letter)
    {
        this.letter = letter;
        links = new TrieNode[26];
        for(int i=0;i<26;i++){//i keep getting a nullPointer exception
            this.links[i].validPrefix=false;
        }
        this.fullWord = false;
        this.validPrefix=true;
    }
}

在我的add方法中,每次添加节点时,我都将节点validPrefix设置为true。

我是有效的前缀方法:

 public boolean isValidPrefix(TrieNode root, String word) {
    int length = word.length();
    char[] letters = word.toCharArray();
    TrieNode curNode = root;
    for (int i = 0; i < length; i++){
        curNode = curNode.links[letters[i]-97];
    }
    return curNode.validPrefix;//get a nullPointerException
}

这是我的参考添加方法

    public void insertWord(TrieNode root, String word){//97 is ascii value
    int length = word.length();
    char[] letters = word.toCharArray();
    TrieNode curNode = root;

    for (int i = 0; i < length; i++){
        if (curNode.links[letters[i]-97] == null)
            curNode.links[letters[i]-97] = new TrieNode(letters[i]);
        curNode = curNode.links[letters[i]-97];
        curNode.validPrefix=true;
    }
    curNode.fullWord = true;  
}

2 个答案:

答案 0 :(得分:1)

根TrieNode []链接用新的TrieNode实例化[26];但那些26没有分配有效对象。  
下面怎么样?

for(int i=0;i<26;i++){
         TrieNode obj = new TrieNode();
                  obj.validPrefix=false;
        this.links[i] = obj;
    }

答案 1 :(得分:0)

我想通了,我只是检查节点是否为空:

public static boolean isValidPrefix(TrieNode root, String word){
    int length = word.length();
    char[] letters = word.toCharArray();
    for (int i = 0; i < length; i++){
        root = root.links[letters[i]-97];
    }
    if(root==null)
        return false;
    return true;
}