【发布时间】:2014-10-18 04:26:21
【问题描述】:
我有一个包含节点的二叉搜索树。每个节点包含一个键值和数据值,节点按键排序。我正在尝试编写一种方法来从我的 BST 中删除一个对象,并提供了一个密钥。代码如下:
public Object remove(Comparable theKey) {
return remove(theKey, rootPtr).data;
}
public Node remove(Comparable theKey, Node node) {
Object o;
if(node == null)
return node;
if(theKey.compareTo(node.key) < 0) {
// go to left subtree
node.leftChild = remove(theKey, node.leftChild);
}else if(theKey.compareTo(node.key) > 0) {
//go to the right subtree
node.rightChild = remove(theKey, node.rightChild);
}else if(theKey.compareTo(node.key) == 0) {
if(node.leftChild != null && node.rightChild != null){
Node foundNode = findMin(node.rightChild);
node.key = foundNode.key;
node.data = foundNode.data;
node.rightChild = remove(node.key, node.rightChild);
}else{
if(node.leftChild != null){
node = node.leftChild;
}else{
node = node.rightChild;
}
}
}
numNodes--;
return node;
}
我想返回与 DELETED 节点关联的数据值。我遇到的问题是:在 public Object remove() 方法中,返回的值不总是根节点的数据值吗?我相信这会发生,因为从第二种方法返回的最终调用将是对 rootPtr(根指针)的引用。如果是这种情况,如何保存已删除节点中的数据?
【问题讨论】:
-
我认为你会更好地重组这个。如果算法不是递归的,它会更清晰、更容易理解。您可以迭代地在树中搜索正确的键,存储值,删除节点并用其左或右子节点替换,然后返回您存储的值。