您的位置:首页 > 其它

Implement Trie (Prefix Tree)

2015-08-17 20:33 447 查看
Implement a trie with insert, search, and startsWith methods.

trie树,又叫字典树,单词查找树。

它有三个特性:根节点不包含字符,除根节点外每一个节点都只包含一个字符;

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;

每个节点的所有子节点包含的字符都不相同。

一个trie node应该包括它的character,它的children和是否是叶结点。



所以先定义TrieNode:

class TrieNode {
// Initialize your data structure here.
char c;
HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();
boolean isLeaf;
public TrieNode(char c){
this.c = c;
}
public TrieNode() { }
}


然后是Trie类,可以实现插入,查找单词(isLeaf=true),查找前缀的操作。

public class Trie {
private TrieNode root;

public Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
public void insert(String word) {
HashMap<Character,TrieNode> children=root.children;
for(int i=0;i<word.length();i++){
char c=word.charAt(i);
TrieNode t;
if(children.containsKey(c)){
t=children.get(c);
}else{
t=new TrieNode(c);
children.put(c,t);
}
children=t.children;
if(i==word.length()-1)
t.isLeaf=true;
}
}

// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode t=findNode(word);
if(t!=null&&t.isLeaf)
return true;
else
return false;
}

// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
if(findNode(prefix)==null)
return false;
else
return true;
}
private TrieNode findNode(String s){
HashMap<Character,TrieNode> children=root.children;
TrieNode t=null;
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(children.containsKey(c)){
t=children.get(c);
children=t.children;
}else
return null;
}
return t;
}
}

// Your Trie object will be instantiated and called as such:
// Trie trie = new Trie();
// trie.insert("somestring");
// trie.search("key");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: