import java.util.Objects;
import java.util.TreeMap;
public class Trie {
private class Node{
public boolean isWord;
public TreeMap<Character,Node> next;
public Node(boolean isWord) {
this.isWord = isWord;
this.next = new TreeMap<>();
}
public Node() {
this(false);
}
}
private Node root;
private int size;
public Trie() {
root = new Node();
size = 0;
}
/**
* 获取trie中存储的单词数量
* @return
*/
public int getSize(){
return size;
}
/**
* 向trie中添加新的单词
* @param word
*/
public void add(String word){
Node cur = this.root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (cur.next.get(c) == null){
cur.next.put(c,new Node());
}
cur = cur.next.get(c);
}
if (!cur.isWord){
cur.isWord = true;
size++;
}
}
/**
* 在trie中删除单词(有错请指点)
* @param word
*/
public boolean remove(String word){
if (word == null || Objects.equals("",word)){
return false;
}
return remove(root,word,0);
}
private boolean remove(Node node, String word, int index) {
if (word.length() == index){//遍历到了要删除单词最后一个字母
if (!node.isWord){
return false;
}
node.isWord = false;
size--;
return true;
}
char c = word.charAt(index);
Node nextNode = node.next.get(c);
if (nextNode == null){//如果没有到字母的最后一个字母
return false;
}
boolean ret = remove(nextNode, word, index + 1);
if (ret && !nextNode.isWord && nextNode.next.size() == 0){
node.next.remove(word.charAt(index));
}
return ret;
}
/**
* c查询单词word是否在trie中
* @param word
* @return
*/
public boolean contaions(String word){
Node cur = this.root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (cur.next.get(c) == null){
return false;
}
cur = cur.next.get(c);
}
return cur.isWord;
}
/**
* 查找是否在trie中有单词以prefix为前缀
* @param prefix
* @return
*/
public boolean isPrefix(String prefix){
Node cur = root;
for (int i = 0; i < prefix.length(); i++) {
char c = prefix.charAt(i);
if (cur.next.get(c) == null){
return false;
}
cur = cur.next.get(c);
}
return true;
}
}
trie树学习
最新推荐文章于 2024-08-11 20:00:32 发布