2014-04-21 25 views
2

我一直在努力計劃如何從trie中刪除單詞。我有一個在節點上使用一維數組的實現,它包含一個單詞的下一個字符。我理解我如何擺脫整個單詞,但不考慮包含較小單詞的較大單詞,以便從以下單詞刪除「bat」,「battle」,「as」和「any」(*表示字的結束),並留下「電池」,「戰場」,「問」和「anywho」:Java - 刪除trie中的單詞(僞代碼)

root 
    /\ 
    a b-a-t*-t-e-r-y* 
/\   | 
n s*-k* l-e*-f-i-e-l-d* 
| 
y*-w-h-o* 

下面是迄今爲止我已經實現了特里:

public class TrieNode { 

    protected char letter = ' '; 
    protected TrieNode parentNode = null; 
    protected boolean fullWord = false; 
    protected TrieNode[] children = new TrieNode[26]; 

    public TrieNode(char letter, TrieNode parentNode){ 
     this.letter = letter; 
     this.parentNode = parentNode; 
    } 

    public boolean hasChildren(){ 
     int index = 0; 

     while(index < children.length){ 
      if(children[index] != null) { 
       return true; 
      } 
      index++; 
     } 
     return false; 
    } 

    public TrieNode nodeForLetter(char ch) { 
     return children[ch - 97]; 
    } 

    public boolean isEndOfWord() { 
     return fullWord; 
    } 
} 

public class Trie implements Iterable<String> { 

    private int numOfNodes; 
    private int numOfWords; 
    private TrieNode root = new TrieNode(' ', null); 

    public Trie() { 
    } 

    public void addWord(String s) { 
     if (hasWord(s)) return; 

     int index = 0; 
     TrieNode iterator = root; 

     while(index < s.length()){ 
      if(iterator.children[s.charAt(index) - 97] == null){ 
       iterator.children[s.charAt(index) - 97] = new TrieNode(s.charAt(index), iterator); 
       numOfNodes++; 
      } 

      iterator = iterator.children[s.charAt(index) - 97]; 

      index++; 

      if(index == s.length()){ 
       iterator.fullWord = true; 
       numOfWords++; 
      } 
     } 
    } 

    // Issues on this one 
    public void deleteWord(String s) { 
     if(s.length() == 0) return; 
     // make method to check for empty trie 
     else if(!(hasWord(s))) return; 
     else { 
      TrieNode iterator = root; 
      int index = 0; 

      while(index < s.length()){ 
       if(iterator.children[index] != null){ 
        /* What would (in pseudo code) need to be put here to account for this */ 
       } 
      } 
     } 
    } 

    public boolean hasWord(String s) { 
     TrieNode current = root; 

     while(current != null){ 
      for (int i = 0; i < s.length(); i++) { 
       if(current.letter == ' ') return false; // error here probably 
       else current = current.children[i]; 
      } 
      if (current.fullWord == true) return true; 
      else return false; 
     } 
     return false; 
    } 

    public Iterator<String> iterator() { 
     return new TrieIterator(); // has basic iterator functions 
    } 

} 

任何人都可以提出一些僞代碼幫我弄明白這一點

回答

0

char =當前位置在trie中

炭1 =線索

  1. 先前的位置找到您想要的線索刪除字。它將由fullWord表示。改變fullWord的狀態。

  2. 這個詞後面是否包含更多的字符?出口。

  3. 在最後一封信中是否包含任何孩子?出口。

- 在這一點上唯一的選擇是,如果這個詞沒有後或孩子的話,那麼刪除 - - 所有字符,直到我們找到一個詞從字典樹 刪除字符或任何孩子,這表示一個新的單詞

'4.雖然當前字符不是一個字滿和沒有一個孩子︰pointer = char-1;刪除char;炭=指針。

'5.退出