TrieTree原理
TrieTree也叫字典树,利用字符串之间的公共前缀,将重复的前缀和并在一起。
其中根节点不包含任何信息。
TrieTree的实现
import java.util.*;
class TrieTreeNode{
char data;
TrieTreeNode []children=new TrieTreeNode[26];
//每一个node的下标就对应着一个字母(假设全为小写字母)
boolean isEnding=false;
public TrieTreeNode(char data) {
this.data=data;
}
}
public class TTree {
static TrieTreeNode root=new TrieTreeNode('/');
//根节点为'/'
public static void showTree(TrieTreeNode root) {
//n叉树的按层展开
Queue<TrieTreeNode>queue=new LinkedList<>();
TrieTreeNode p=root;
queue.add(p);
int size=queue.size();
while(!queue.isEmpty()) {
TrieTreeNode t=queue.poll();
for(TrieTreeNode node:t.children) {
if(node!=null)
{System.out.print(node.data+" ");
queue.add(node);}
}
size--;
if(size==0) {
size=queue.size();
System.out.println();
}
}
}
public static boolean search(char[]target) {
//查找是否有匹配的字符串
TrieTreeNode p=root;
for(int i=0;i<target.length;i++) {
int index=target[i]-'a';
if(p.children[index]==null)return false;
p=p.children[index];
}
if(p.isEnding==false)return false;//只匹配了前缀
else return true;
}
public static void buildTree(char[] text) {
//建立一棵TrieTree
TrieTreeNode p=root;
for(int i=0;i<text.length;i++) {
int index=text[i]-'a';
if(p.children[index]==null) {
p.children[index]=new TrieTreeNode(text[i]);
}
p=p.children[index];
}
p.isEnding=true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TrieTreeNode p=root;
char[]text= {'h','e','l','l','o'};
char[]text2= {'h','e','r'};
char[]text3= {'h','i'};
char[]text4= {'h','o','w'};
char[]text5= {'s','e','e'};
char[]text6= {'s','o'};
buildTree(text);
buildTree(text2);
buildTree(text3);
buildTree(text4);
buildTree(text5);
buildTree(text6);
showTree(root);
String s="howe";
System.out.println(search(s.toCharArray()));
//输出结果是false
}
}
show方法的作用是我当时写完想看看是否建成了一棵树,结果发现不会写n叉树展开。尴尬。。。这是我写的n叉树按层展开链接.
这是看完数据结构与算法之后的一次尝试。