我找不到我的刪除算法出了什麼問題。當我在BST的根上運行我的刪除方法時,它將用右子樹的最小值替換根,但此後不刪除節點。從Java中的二進制搜索樹中刪除
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
@amit顯然它沒有連接到問題。這就是爲什麼我把它發佈爲評論而不是答案。即使編譯器在這種情況下處理它,OP也許應該學習以遞歸方式迭代地執行* most *方法(除非學習遞歸)。 –