Trie 字典树(前缀树)、Trie创建、Trie的添加元素

版权声明:版权声明:本文为博主原创文章,转载时请注明出处——作者:冰怜 https://blog.csdn.net/xiaoxin0630/article/details/87817383

Trie

isWord 标记单词是否结束末尾

Trie的创建

TreeMap是树结构的Map、Character包装类的char

需要初始化Trie,用构造方法来初始化

this.isWord=isWord;//把传过来的isWord给了构造参数isWord

next=new TreeMap<>();//创建新的节点 并指向了新创建的

private class Node{
		
		public boolean isWord;//标记 是否单词结束 
		public TreeMap<Character, Node> next;//TreeMap 树结构的map character是char包装类 
		
		/**
		 * 节点初始化(构造方法创建)
		 * @param isWord	标记单词是否结束
		 */
		public Node(boolean isWord){
			this.isWord=isWord;
			next =new TreeMap<>();//next指向新的节点
		}
		
		public Node(){
			this(false);//isWork 默认赋值false
		}
}

添加单词

添加新的单词 把它拆分一个个的字符然后传进去

判断第一个字符是否存在 没有就创建一个节点

有的话就不断往下更新

最后判断单词是否结束,size+1 统计单词数

//向Trice中添加一个新的单词word
	public void add(String word){
		
		Node cur=root;
		for(int i=0;i<word.length();i++){
			char c=word.charAt(i);//word.charAt 吧string 拆成一个个的字符
			
			//是否已经有指向c的内容 没有c 就创建新的节点
			if(cur.next.get(c) == null)
				cur.next.put(c, new Node());
			
			cur=cur.next.get(c);
		}
		//isword 判断是否falas 判断以前是否存在
		if(!cur.isWord){
			cur.isWord=true;
			size++;
		}
		
	}

整体的代码

package com.binglian.Trie;

import java.util.TreeMap;

/**
 * Trie(多叉树) 字典树也可以说前缀树
 * 
 * 我的理解,它是一个单词一个节点,不是一个字符一个节点
 * @author binglian
 *
 */
public class Trie {
	
	/**
	 * 一个私有的节点 字典树的创建
	 * @author binglian
	 *
	 */
	private class Node{
		
		public boolean isWord;//标记 是否单词结束 
		public TreeMap<Character, Node> next;//TreeMap 树结构的map character是char包装类 
		
		/**
		 * 节点初始化(构造方法创建)
		 * @param isWord	标记单词是否结束
		 */
		public Node(boolean isWord){
			this.isWord=isWord;
			next =new TreeMap<>();//next指向新的节点
		}
		
		public Node(){
			this(false);//isWork 默认赋值false
		}
	}
	
	private Node root;//根节点
	private int size;
	
	/**
	 * 字段数初始化
	 */
	public Trie(){
		root=new Node();
		size=0;
	}
	
	/**
	 * 获得Tire中存储的单词数量
	 * @return
	 */
	public int getSize(){
		return size;
	}
	
	//向Trice中添加一个新的单词word
	public void add(String word){
		
		Node cur=root;
		for(int i=0;i<word.length();i++){
			char c=word.charAt(i);//word.charAt 吧string 拆成一个个的字符
			
			//是否已经有指向c的内容 没有c 就创建新的节点
			if(cur.next.get(c) == null)
				cur.next.put(c, new Node());
			
			cur=cur.next.get(c);
		}
		//isword 判断是否falas 判断以前是否存在
		if(!cur.isWord){
			cur.isWord=true;
			size++;
		}
		
	}
	
	
	
}

猜你喜欢

转载自blog.csdn.net/xiaoxin0630/article/details/87817383