liuyubobobo / Play-with-Data-Structures

Codes of my MOOC Course <Play Data Structures in Java>. Updated contents and practices are also included. 我在慕课网上的课程《Java语言玩转数据结构》示例代码。课程的更多更新内容及辅助练习也将逐步添加进这个代码仓。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TrieMap 中的一个小 Bug

kerraway opened this issue · comments

文件:10-Trie/Optional-02-Trie-Delete/src/RandomizedSet_Trie.java
行数:121 行后
方法:#remove(String)
问题:应该缺少 stack.pop();

// 删除word, 返回是否删除成功
public boolean remove(String word){

    Stack<Node> stack = new Stack<>();
    stack.push(root);
    for(int i = 0; i < word.length(); i ++){
        if(!stack.peek().next.containsKey(word.charAt(i)))
            return false;
        stack.push(stack.peek().next.get(word.charAt(i)));
    }

    if(!stack.peek().isWord)
        return false;

    // 将该单词结尾isWord置空
    stack.peek().isWord = false;
    size --;

    // 如果单词最后一个字母的节点的next非空,
    // 说明trie中还存储了其他以该单词为前缀的单词,直接返回
    if(stack.peek().next.size() > 0)
        return true;
    else
        stack.pop();

    // 自底向上删除
    for(int i = word.length() - 1; i >= 0; i --){
        stack.peek().next.remove(word.charAt(i));
        // 如果上一个节点的isWord为true,或者是其他单词的前缀,则直接返回
        if(stack.peek().isWord || stack.peek().next.size() > 0)
            return true;
        // ==============
        stack.pop();
        // ==============
    }
    return true;
}

非常感谢,你是正确的。现在已经修复:)

如果愿意,可以加一个微信好友:liuyubobobo