字典树及其实现

字典树,即Trie树(踹树,读起来很舒适)
值是在边上的。不过在代码里我存储在TrieNode当中。
在我的代码中,
1.TrieNode为Trie树的内部类,表示结点。
2.结点的value存储从双亲结点到达当前结点的边上的值。
3.结点的children数组(总觉得用sons的日子一去不复返了)以char字符-'a’为下标,存储对应value的TrieNode.
4.根节点root是没有value的;判断是否可以字符串的下一个字符ch[i]为路径从当前结点cur到达它的某个孩子结点,只需看cur的children数组中有没有以ch[i]-’a’下标的元素,而不需要用到孩子结点的value值。
5.value值只在insert函数中新建孩子结点时会用到。将新建的孩子结点的value置为ch[i],而非其下标ch[i]-‘a’。
6.has函数,是查询是否完全匹配。循环平安结束后,如果终点结点的isEnd不是true,仍然返回false。这是一本只读的字典。

public class Trie {
    
    
	TrieNode root;
	class TrieNode{
    
    
		private char value;
		private boolean isEnd;
		private TrieNode[] children = new TrieNode[26];
		public TrieNode() {
    
    
			isEnd = false;
		}
	}
	public Trie() {
    
    
		root = new TrieNode();
	}
	public void insert(String str) {
    
    
		if(str==null||str.length()==0)return;
		char[] letters = str.toCharArray();
		TrieNode cur = root;
		int pos;
		for(int i=0;i<letters.length;i++) {
    
    
			pos = letters[i]-'a';
			if(cur.children[pos]==null) {
    
    
				cur.children[pos] = new TrieNode();
				cur.children[pos].value = letters[i];
			}
			cur = cur.children[pos];
		}
		cur.isEnd=true;
	}
	//在字典树中查询是否完全匹配一个指定的字符串
	public boolean has(String str) {
    
    
		if(str==null||str.length()==0)return false;
		char letters[]=str.toCharArray();
		TrieNode cur = root;
		int pos;
		for(int i=0;i<letters.length;i++) {
    
    
			pos = letters[i]-'a';
			if(cur.children[pos]==null)return false;
			cur = cur.children[pos];
		}
		return cur.isEnd;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42021845/article/details/115675363