这个有问题留个言哈 谢谢了
直接贴代码了
import java.util.TreeMap;
public class Trietree {
//这个树结构的作用是用来查询单词的 在查询的时候的复杂度很低
//node就是里面的节点 节点包括一个布尔类型 和一个treemap
//isword的作用是为了 看这个单词在这里有没有完 treemap是为了查看下一个里面包含一个单词和一个node
public class Node {
public boolean isword;
public TreeMap<Character, Node> next;
//其实这个也是有缺点的 它必须为每个node创建一个treemap
//性能会减弱
public Node(boolean isword) {
this.isword = isword;
next = new TreeMap<>();
}
public Node() {
this.isword = false;
}
}
private Node root;//里面应该包含一个根节点
private int size;
public Trietree() {
root = new Node();
size = 0;
}
public int getSize() {
return size;
}
//在树中添加元素
public void add(String word) {
Node cur = root;//先创建一个根节点
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
//if后面的操作就是说 如果cur后面为空的话 直接加就完了
//如果不为空的话 那么查看下一个值
if (cur.next.get(c) == null) {
cur.next.put(c, new Node());
}
cur = cur.next.get(c);
}
//在for完后 说明已经添加完毕 那么剩下就只是需要看 下面的if是为了判断以前这个isword是不是结束了这个单词
if (!cur.isword) {
cur.isword = true;
size++;
}
}
//判断一个单词是否包含在树中
public boolean contains(String word){
Node cur=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;//这里是因为可以有得单词它被包含到了其他单词的里面 比如pat patern 所以只有
//它的isword结束那么才说明了树里面有它
}
//给一个单词的前缀 看树里有没有以这个为前缀的单词
public boolean iscontains(String qian){
Node cur=root;
for (int i = 0; i < qian.length(); i++) {
char c = qian.charAt(i);
if (cur.next.get(c) == null) {
return false;
}
cur = cur.next.get(c);
}
return true;//这个就很好理解了 就是为了看有没有这个东西的
}
//这个方法比较特殊 是查询一个这样的单词 比如w。。。a 那么这个。。。我们是不知道的 所以就是在树的结构中去
//查询看这个东西 就是直到它的开始和结束
//所以在树的结构中 使用递归可以更简单的知道这个是怎么进行的
public boolean specontains(String word){
return search(root,word,0);
}
//可以去看leet211 应该类似 我不是很确定是不是这个题
private boolean search(Node node,String word,int index){
if(index==word.length()){ //递归终止的条件 当这个单词已经被查找到最后一个位置
return node.isword;//此时上传这个的作用是看此时是否已经到了这个树中所含单词的结尾 是就是true
}
char c=word.charAt(index);
if(c!='.'){//此时这个点的意思就是我上面说的那个... 一样的东西 那个w。。。a的。
if(node.next.get(c)==null){
return false;
}else return search(node.next.get(c),word,index+1);
//如果找到了这个值 那么就再去寻找下一个值 使用递归
}else {
//如果c所包含的值为。 那么遍历所有树的下一层 下所有的下一层里面进行递归 来查看是否包含这个值
for(char nextchar:node.next.keySet()){
if(search(node.next.get(nextchar),word,index+1)){
return true;
}
}
return false;
}
}
}