【发布时间】:2015-08-30 05:29:01
【问题描述】:
我找不到我的删除算法有什么问题。当我在 BST 的根节点上运行删除方法时,它会将根节点替换为右子树的最小值,但此后不会删除节点。
public void delete(BinaryTreeNode node, int x){
if (node==null)
return;
else if (x<node.getKey())
delete(node.getLeftChild(),x);
else if (x>node.getKey())
delete(node.getRightChild(),x);
else{
if (node.getLeftChild()==null)
node = node.getRightChild();
else if (node.getRightChild()==null)
node = node.getLeftChild();
else{
BinaryTreeNode temp = findMin(node.getRightChild());
System.out.println(temp.getKey() + " " + node.getKey());
node.setKey(temp.getKey());
System.out.println(temp.getKey() + " " + node.getKey());
delete(node.getRightChild(), node.getKey());
}
}
}
还有我的 findMin() 方法:
public BinaryTreeNode findMin(BinaryTreeNode node){
if (node.getLeftChild()==null)
return node;
else
return findMin(node.getLeftChild());
}
对于包含所有整数 1-9 且根为 4 的 BST,我的 inorderPrint() 输出产生
1,2,3,5,5,6,7,8,9
而不是
1,2,3,5,6,7,8,9
【问题讨论】:
-
迭代地而不是递归地执行
findMin(...)方法。 -
@CyberneticTwerkGuruOrc 这与问题无关,我怀疑它会被大多数编译器优化,因为这是尾递归。在这种情况下,我发现递归解决方案更具可读性。
-
@amit 显然它与问题无关。这就是为什么我将其发布为评论而不是答案。即使在这种情况下编译器会处理它,OP 也应该学会以递归方式迭代地执行 大多数 方法(除非研究递归)。