Summary: Trie Data Structure

Implement a Trie Data Structure, and search() & insert() function:

we need to implement both Class Trie and Class TrieNode

Class Trie:

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Trie
 5 {
 6    private TrieNode root;
 7    
 8    /**
 9     * Constructor
10     */
11    public Trie()
12    {
13       root = new TrieNode();
14    }
15    
16    /**
17     * Adds a word to the Trie
18     * @param word
19     */
20    public void addWord(String word)
21    {
22       root.addWord(word.toLowerCase());
23    }
24    
25    /**
26     * Get the words in the Trie with the given
27     * prefix
28     * @param prefix
29     * @return a List containing String objects containing the words in
30     *         the Trie with the given prefix.
31     */
32    public List getWords(String prefix)
33    {
34       //Find the node which represents the last letter of the prefix
35       TrieNode lastNode = root;
36       for (int i=0; i<prefix.length(); i++)
37       {
38       lastNode = lastNode.getNode(prefix.charAt(i));
39       
40       //If no node matches, then no words exist, return empty list
41       if (lastNode == null) return new ArrayList();      
42       }
43       
44       //Return the words which eminate from the last node
45       return lastNode.getWords();
46    }
47 }

Class TrieNode:

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 
  4 public class TrieNode
  5 {
  6    private TrieNode parent;
  7    private TrieNode[] children;
  8    private boolean isLeaf;     //Quick way to check if any children exist
  9    private boolean isWord;     //Does this node represent the last character of a word
 10    private char character;     //The character this node represents
 11 
 12    /**
 13     * Constructor for top level root node.
 14     */
 15    public TrieNode()
 16    {
 17       children = new TrieNode[26];
 18       isLeaf = true;
 19       isWord = false;
 20    }
 21 
 22    /**
 23     * Constructor for child node.
 24     */
 25    public TrieNode(char character)
 26    {
 27       this();
 28       this.character = character;
 29    }
 30    
 31    /**
 32     * Adds a word to this node. This method is called recursively and
 33     * adds child nodes for each successive letter in the word, therefore
 34     * recursive calls will be made with partial words.
 35     * @param word the word to add
 36     */
 37    protected void addWord(String word)
 38    {
 39       isLeaf = false;
 40       int charPos = word.charAt(0) - 'a';
 41       
 42       if (children[charPos] == null)
 43       {
 44       children[charPos] = new TrieNode(word.charAt(0));
 45       children[charPos].parent = this;
 46       }
 47       
 48       if (word.length() > 1)
 49       {
 50       children[charPos].addWord(word.substring(1));
 51       }
 52       else
 53       {
 54       children[charPos].isWord = true;
 55       }
 56    }
 57    
 58    /**
 59     * Returns the child TrieNode representing the given char,
 60     * or null if no node exists.
 61     * @param c
 62     * @return
 63     */
 64    protected TrieNode getNode(char c)
 65    {
 66       return children[c - 'a'];
 67    }
 68    
 69    /**
 70     * Returns a List of String objects which are lower in the
 71     * hierarchy that this node.
 72     * @return
 73     */
 74    protected List getWords()
 75    {
 76       //Create a list to return
 77       List list = new ArrayList();
 78       
 79       //If this node represents a word, add it
 80       if (isWord)
 81       {
 82       list.add(toString());
 83       }
 84       
 85       //If any children
 86       if (!isLeaf)
 87       {
 88       //Add any words belonging to any children
 89       for (int i=0; i<children.length; i++)
 90       {
 91          if (children[i] != null)
 92          {
 93             list.addAll(children.getWords());
 94 
 95      }
 96 
 97      }
 98 
 99 }
100 
101 return list; 
102 
103 }
104 
105 
106 
107 /**
108 
109 * Gets the String that this node represents.
110 
111 * For example, if this node represents the character t, whose parent
112 
113 * represents the charater a, whose parent represents the character
114 
115 * c, then the String would be "cat".
116 
117 * @return
118 
119 */
120 
121 public String toString()
122 
123 {
124 
125 if (parent == null)
126 
127 {
128 
129      return "";
130 
131 }
132 
133 else
134 
135 {
136 
137      return parent.toString() + new String(new char[] {character});
138 
139 }
140 
141 } 
142 
143 }
原文地址:https://www.cnblogs.com/EdwardLiu/p/4383403.html