对于Trie这种数据结构的添加操作结合LeetCode208号问题出现了错误

来源:10-2 Trie字典树基础

南山乔木枝

2018-07-18

//img.mukewang.com/szimg/5b4ecb700001837113070415.jpg

//img.mukewang.com/szimg/5b4ecbe400018fae12070290.jpg

下面是我的测试代码:

package facelay.base;

import java.util.TreeMap;

public class Trie {

     private class Node {

         public boolean isWord;

         public TreeMap<Character, Node> next;

        

         public Node(boolean isWord) {

         this.isWord = isWord;

         this.next = new TreeMap<>();

         }

    

         public Node() {

             this(false);

          }

     }


     private Node root;

     private int size;


     public Trie() {

         root = new Node();

         size = 0;

     }


     public int getSize() {

          return size;

     }


     // 向Trie中添加一个新的单词word

     public void add(String word) {

         Node cur = root;

         for (int i = 0; i < word.length(); i++) {

             char c = word.charAt(i);

             if (cur.next.get(c) == null) {

                  cur.next.put(c, new Node());

             } else {

                 cur = cur.next.get(c);

             }

         }

         if (!cur.isWord) {

             cur.isWord = true;

             size++;

         }

     }


     // 查询Trie中的某个单词是否存在

     public boolean query(String word) {

         Node cur = root;

         for (int i = 0; i < word.length(); i++) {

             char c = word.charAt(i);

             if (cur.next.get(c) == null) {

                  return false;

             } else {

                 cur = cur.next.get(c);

             }

         }

         return cur.isWord;

     }


     // 查询单词的前缀

     public boolean prefix(String word) {

         Node cur = root;

         for (int i = 0; i < word.length(); i++) {

             char c = word.charAt(i);

             if (cur.next.get(c) == null) {

                  return false;

             } else {

                 cur = cur.next.get(c);

             }

         }

         return true;

     }


     public static void main(String[] args) {

         Trie trie = new Trie();

         trie.add("aple");

         System.out.println(trie.query("aple"));

         // System.out.println(trie.query("app"));

         // System.out.println(trie.prefix("app"));

         // trie.add("app");

         // System.out.println(trie.query("app"));

     }

}



写回答

1回答

liuyubobobo

2018-07-18

在你的代码中,for循环里的逻辑不是if else的关系。


不管cur.next里有没有c,都要执行cur= cur.next.get(c)。如果之前cur.next里没有c,我们加上,如果已经有了,那就太好了,不用加了。这个if逻辑执行完,cur.next里一定包含c了,然后我们的cur移到下一个节点,即:cur= cur.next.get(c)


在回顾一下课程中Trie的讲解?


同时,课程的所有代码,都可以在官方github中找到,传送门:https://github.com/liuyubobobo/Play-with-Data-Structures


其中,对于使用我们实现的Trie,完成Leetcode 208号问题的代码,可以参考:https://github.com/liuyubobobo/Play-with-Data-Structures/blob/master/10-Trie/04-Prefix-in-Trie/src/Trie208.java (提交时需要修改类名:)


加油!

0
1
南山乔木枝
非常感谢!
2018-07-18
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程