leetcode有一个功能没有实现就是查询给个前缀,查以这个 前缀结束的数量,其实很简单就是找前缀方法把path划过的次数输出即可,这个前缀树很简单,但是一定要把字母放在边上,不要放在节点里面,否则很难做
前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。
class Trie {
public static class TrieNode{
int path;
int end;
TrieNode[] nexts;
public TrieNode(){
path=0;
end=0;
nexts=new TrieNode[26];//针对字母的,都是用数字实现的,代表边是哪个字母哈,例如0就代表a边
}
}
/** Initialize your data structure here. */
TrieNode root;
public Trie() {
root=new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
if(word==null){
return;
}
TrieNode node=root;
char[] chs=word.toCharArray();
for(int i=0;i<chs.length;i++){
int index=chs[i]-'a';
if(node.nexts[index]==null){
node.nexts[index]=new TrieNode();
}
node=node.nexts[index];
node.path++;
}
node.end++;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
if(word==null){
return false;
}
TrieNode node=root;
char[] chs=word.toCharArray();
for(int i=0;i<chs.length;i++){
int index=chs[i]-'a';
if(node.nexts[index]==null){
return false;
}
node=node.nexts[index];
}
if(node.end>=1){
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(prefix==null){
return false;
}
TrieNode node=root;
char[] chs=prefix.toCharArray();
for(int i=0;i<chs.length;i++){
int index=chs[i]-'a';
if(node.nexts[index]==null){
return false;
}
node=node.nexts[index];
}
return true;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/
插入节点是递归的方法(自己写的,很难看,leetcode里面有完美的):
class Trie {
public static class TrieNode{
int path;
int end;
TrieNode[] nexts;
public TrieNode(){
path=0;
end=0;
nexts=new TrieNode[26];//针对字母的
}
}
/** Initialize your data structure here. */
TrieNode root;
public Trie() {
root=new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
if(word==null){
return;
}
TrieNode node=root;
char[] chs=word.toCharArray();
insertdg(0,chs,node);
}
public void insertdg(int high,char[] chs,TrieNode node){
int index=chs[high]-'a';
TrieNode child=node.nexts[index];
if(child==null){
child=new TrieNode();
node.nexts[index]=child;
}
if((high+1)==chs.length){
child.end=child.end+1;
return ;
}
insertdg(high+1,chs,child);
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
if(word==null){
return false;
}
TrieNode node=root;
char[] chs=word.toCharArray();
for(int i=0;i<chs.length;i++){
int index=chs[i]-'a';
if(node.nexts[index]==null){
return false;
}
node=node.nexts[index];
}
if(node.end>=1){
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(prefix==null){
return false;
}
TrieNode node=root;
char[] chs=prefix.toCharArray();
for(int i=0;i<chs.length;i++){
int index=chs[i]-'a';
if(node.nexts[index]==null){
return false;
}
node=node.nexts[index];
}
return true;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/