标签:
public class Trie{ private Node root; public Trie(){ root = new Node(' '); } public void insert(String word){ if(search(word) == true) return; Node current = root; for(int i = 0; i < word.length(); i++){ Node child = current.subNode(word.charAt(i)); if(child != null){ current = child; } else { current.childList.add(new Node(word.charAt(i))); current = current.subNode(word.charAt(i)); } current.count++; } current.isEnd = true; }
/** *怎么判断单词是否存在? *被判断的单词的字母与根节点下的子节点的字母进行比较,直到匹配到两者最后一个字母相同,并且最后一个节点的isEnd标记为true */ public boolean search(String word){ Node current = root; for(int i = 0; i < word.length(); i++){ if(current.subNode(word.charAt(i)) == null) return false; else current = current.subNode(word.charAt(i)); } if (current.isEnd == true) return true; else return false; } public void deleteWord(String word){ if(search(word) == false) return; Node current = root; for(char c : word.toCharArray()) { Node child = current.subNode(c); if(child.count == 1) { current.childList.remove(child); return; } else { child.count--; current = child; } } current.isEnd = false; }
public static void main(String[] args) { Trie trie = new Trie(); //trie.insert("ball"); trie.insert("balls"); trie.deleteWord("balls"); trie.insert("sense"); // testing deletion System.out.println(trie.search("balls")); System.out.println(trie.search("ba")); trie.deleteWord("balls"); System.out.println(trie.search("balls")); System.out.println(trie.search("ball")); } }
class Node { char content; // 节点包含的内容 boolean isEnd; // 是否在该节点行成过一个单词 int count; // 统计该节点的字符被几个单词共享 LinkedList<Node> childList; // 子节点的集合 //初始化 public Node(char c){ childList = new LinkedList<Node>(); isEnd = false; content = c; count = 0; } //查找子节点中是否有内容为x的子节点,有则返回该子节点,否则返回空 public Node subNode(char c){ if(childList != null){ for(Node eachChild : childList){ if(eachChild.content == c){ return eachChild; } } } return null; } }
标签:
原文地址:http://blog.csdn.net/u012572955/article/details/51331318