[英]How do I delete a node from a binary search tree
如何實現從二進制搜索樹中刪除節點的功能? 下面是我當前的功能:
void makeDeletion(TreeNode *&tree) {
TreeNode *NodeToDelete;
NodeToDelete = tree;
TreeNode *InOrder;
if (tree->right == NULL && tree->left == NULL) {
delete NodeToDelete;
}
if (tree->right == NULL) {
tree = tree->left;
delete NodeToDelete;
}
else if (tree->left == NULL) {
tree = tree->right;
delete NodeToDelete;
}
else {
InOrder = tree->right;
while (InOrder->left != NULL) {
InOrder = InOrder->left;
}
NodeToDelete->value = InOrder->value;
remove(InOrder, InOrder->value);
}
}
這是我具有的remove
功能,用於定位要刪除的值:
void remove(TreeNode *&tree, ANY num) {//Removed Need for ">"
if (tree == NULL){
return;
}
if (tree->value == num) {
makeDeletion(tree);
} else if (num < tree->value) {
remove(tree->left, num);
} else {
remove(tree->right, num);
}
};//Remove
就目前而言,我感覺自己已經很接近了,但是當我輸出二進制樹的內容時,程序崩潰了。 我正在嘗試使用一種方法,如果該節點有兩個孩子,則找到順序繼承者,交換順序繼承者和要“刪除”的節點的節點值,然后刪除順序繼承者。 如果不調整remove
函數,那么使makeDeletion
函數如所描述的makeDeletion
工作,我會丟失什么信息?
編輯:在makeDeletion
函數中,我錯誤地連續寫了兩個if
語句。 第二個if
語句應該是else if
語句。
在makeDeletion
,如果tree
是葉(包括left
和right
是NULL
),你刪除葉節點,並且不設置tree = nullptr
。 這會將懸空的引用留在樹中,以釋放已釋放的內存。 另外,然后在下一個if
取消引用(現在已刪除)節點。 其中任何一種都可能導致崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.