我试图从二进制搜索树中删除一个存储像Dictionary这样的单词的节点。 DictEntry元素包含单词,定义和将要显示的定义类型的数字(字符串,图像等)。找不到单词时抛出DictionaryException。
用户必须能够通过仅在方法中输入单词来删除条目。这些是用于删除的以下方法;
public void remove(String word) throws DictionaryException {
if (root!=null) {
//checks if the word is equal to the entrie's word
if (word.equals(root.getElement().word()))
root = replacement(root);
else {
// parent is the node above current
BinaryTreeNode<DictEntry> current, parent = root;
boolean found = false;
// if lexicographically smaller than the root's word
if (word.compareTo(root.getElement().word()) < 0)
current = root.getLeft();
// if lexicographically higher than the root's word
else
current = root.getRight();
while (current != null && !found) {
if (word.equals(current.getElement().word())) {
found = true;
if (current == current.getLeft())
parent.setLeft(replacement(current));
else
parent.setRight(replacement(current));
} else {
parent = current;
if (word.compareToIgnoreCase(current.getElement()
.word()) < 0)
current = current.getLeft();
else
current = current.getRight();
}// end if else
}// end while
if (!found)
throw new DictionaryException("The entry was not found");
}
}
}
private BinaryTreeNode<DictEntry> replacement(BinaryTreeNode<DictEntry> node) {
BinaryTreeNode<DictEntry> found = null;
// check if both sides are empty
if (node.getLeft() == null && node.getRight() == null)
found = null;
else if (node.getLeft() != null && node.getRight() == null)
found = node.getLeft();
else if (node.getLeft() == null && node.getRight() != null)
found = node.getRight();
// if both sides have an entry
else {
//helper positions
BinaryTreeNode<DictEntry> current = node.getRight();
BinaryTreeNode<DictEntry> parent = node;
//moving positions
while (current.getLeft() != null) {
parent = current;
current = current.getLeft();
}// end while
if (node.getRight() == current)
current.setLeft(node.getLeft());
else {
parent.setLeft(current.getRight());
current.setRight(node.getRight());
current.setLeft(node.getLeft());
}
found = current;
}// end if else
return found;
}
我的问题是,每当我尝试测试它时,节点都不会删除,其中字典代表BinarySearchTree;
// Insert and remove a word
try {
dictionary.insert("course","A series of talks or lessons",1);
dictionary.remove("course");
res = dictionary.findWord("course");
if (res == "") {System.out.println("Remove test passed");}
else {System.out.println("Remove test failed");}
}
catch(DictionaryException e) {
System.out.println("Remove test 4 failed");
}
我已经尝试过使用我的插入方法进行查找和播放,但是我什么都没有,所以我假设问题出现在我的逻辑中去除。
答案 0 :(得分:1)
从最初看,替换方法是使用==运算符进行节点比较。这只比较节点的内存地址。如果要根据节点的值进行比较,则需要使用.equals()方法。