树节点TreeNode
- static final int MAX_SIZE = 26; // 最大孩子指针数(针对全小写的单词)
- char data; // 每个节点存储一个字符
- TreeNode[] childs; // 指向孩子节点的指针数组
- boolean isEnd; // 单词结束标志
TireTree结构和实现快速查找的原理

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class TreeNode{
static final int MAX_SIZE = 26;
char data;
TreeNode[] childs;
boolean isEnd;
public TreeNode(){
this.childs = new TreeNode[MAX_SIZE];
this.isEnd = false;
}
public TreeNode(char ch){
this.data = ch;
this.childs = new TreeNode[MAX_SIZE];
this.isEnd = false;
}
}
// 字典树
public class TireTree {
// 在字典树中创建词子树
public void createTireTree(TreeNode node, String str) {
char[] chars = str.toCharArray();
int loc = 0;
for(int i = 0, j = chars.length; i < j; i++) {
// 字符映射下标
loc = chars[i] - 'a';
if(node.childs[loc] == null) {
node.childs[loc] = new TreeNode(chars[i]);
}
node = node.childs[loc];
}
node.isEnd = true;
}
// 在字典树中查找某单词
public boolean find(TreeNode node, String str) {
char[] chars = str.toCharArray();
int loc = 0;
for(int i = 0, j = chars.length; i < j; i++) {
loc = chars[i] - 'a';
if(node.childs[loc] != null) {
node = node.childs[loc];
} else {
return false;
}
}
return node.isEnd;
}
// 连续字符串分词
public List<String> stringToWords(TreeNode node, String str) {
char[] chars = str.toCharArray();
TreeNode p = node;
List<String> list = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
int loc = 0;
for (int i = 0, j = chars.length; i < j; i++) {
loc = chars[i] - 'a';
if (p.childs[loc] != null) {
sb.append(chars[i]);
if (p.childs[loc].isEnd) { // 如果单词结束
list.add(String.valueOf(sb));
sb.delete(0, sb.length());
p = node;
} else {
p = p.childs[loc];
}
} else {
return null;
}
}
return list;
}
// 单词补齐
public List<String> wordFill(TreeNode node, String str) {
char[] chars = str.toCharArray();
int loc = 0;
List<String> list = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
// 找到字符串末字符在字典树中的位置
for (int i = 0, j = chars.length; i < j; i++) {
loc = chars[i] - 'a';
if (node.childs[loc] != null) {
sb.append(chars[i]);
node = node.childs[loc];
} else {
return null;
}
}
// 子树将单词补齐
scanFind(node, String.valueOf(sb), list);
return list;
}
// 搜索子树
public void scanFind(TreeNode node, String prefix, List<String> list) {
for (int i = 0, j = node.childs.length; i < j; i++) {
if (node.childs[i] != null) {
list.add(prefix + node.childs[i].data);
scanFind(node.childs[i], prefix, list);
}
}
}
public static void main(String[] args) {
TreeNode rood = new TreeNode();
TireTree tree = new TireTree();
String[] strs = {"public", "static", "void", "main", "maia", "maib", "maic"};
for (int i = 0, j = strs.length; i < j; i++) {
tree.createTireTree(rood, strs[i]);
}
System.out.println(tree.find(rood, "main") + "\n************************************************");
String str1 = "publicstaticvoidmain";
List<String> list1 = tree.stringToWords(rood, str1);
Iterator iter1 = list1.iterator();
while(iter1.hasNext()) {
System.out.println(iter1.next());
}
System.out.println("************************************************");
String str2 = "mai";
List<String> list2 = tree.wordFill(rood, str2);
Iterator iter2 = list2.iterator();
while(iter2.hasNext()) {
System.out.println(iter2.next());
}
}
}