[英]Delete Node in BST (2)
我有BST,當我想從BST刪除節點時,什么也沒發生。 有人可以解釋為什么嗎?
這是我的代碼:
private void delete(int value, Node node) {
if (value<node.value) delete(value, node.left);
else if (value> node.value)
delete(value, node.right);
else {
if (node.left != null && node.right != null) {
int maxFromLeft = findMax(node.left);
node.value = maxFromLeft;
delete(maxFromLeft, node.left);
} else if (node.left != null) {
Node trash = node;
node = node.left;
trash = null;
} else if (node.right != null) {
Node trash = node;
node = node.right;
trash = null;
} else {
node = null;
}
}
}
考慮這部分
if (node.left != null) {
Node trash = node;
node = node.left;
trash = null;
}
您需要刪除node
。 這什么也不做node = node.left
。 它只是將一個引用分配給另一個引用。 這不需要太trash = null
。
要刪除節點,您需要先斷開其與父節點的連接,然后將已刪除節點的一個子節點連接到父節點,然后將其他子節點插入該節點!
簽名為void delete(int,Node)
方法無法工作。 請考慮當您嘗試從僅具有一個節點的樹中刪除根節點時會發生什么:該方法無法刪除該節點,因為方法參數是通過值傳遞的。
您可以從此方法返回修改后的BST:
Node delete(int value, Node node) {
if (value<node.value) node.left = delete(value, node.left);
else if (value> node.value)
node.right = delete(value, node.right);
...I'll leave the rest as an exercise...
return node;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.