波波老师您好,我是这样想的:在正常删除的过程中只遍历一遍,记录一个分支的节点和后一个字母,例如teach和teachers中删除teachers就记录h所在的节点和’e’,这样只调用一次remove即可删除后续所有节点。我简单测试过一些数据没问题,但是不知道有没有逻辑上遗漏的地方,还请老师指点指点 : }
public Boolean remove(String word){
Node cur = root;
Node divide = root; //用来标记可能存在的最后一个分支节点
char flagLetter=' '; //用来记录remove中字母
for(char c:word.toCharArray()){
//如果没有待删除单词就直接返回false
if(!cur.next.containsKey(c)){
return false;
}
//如果待删单词前面有别的单词或者某个字母有多个后续节点就记录当前位置
//tea teach teacher
//删除teacher:先记录a所在节点和'c',再记录h所在节点和'e',最后执行remove('e')
//tell tall
//删除tall:记录t所在节点和'a',最后在t所在节点上执行remove('a')
if(cur.isWord || cur.next.size()>1){
divide = cur;
flagLetter = c; //记录后一个字母
}
cur = cur.next.get(c);
}
// 遍历结束到了待删单词的末尾
// 首先如果isWord=false则表明并没有此单词
if(!cur.isWord){
return false;
}
// 如果有后续节点就直接设置isWord=false
if(!cur.next.isEmpty()){
cur.isWord = false;
}else {
//如果单词末尾没有节点了,就一直删除到前一个单词末尾或者分支处(divide)
divide.next.remove(flagLetter);
}
size --;
return true;
}