我試圖理解這個在線建立的函數,用於從BST中刪除一個節點。有些事情我無法理解從BST中刪除節點C
這是代碼:
struct Node* Delete(struct Node *root, int data) {
if (root == NULL) {
return NULL;
}
if (data > root->data) { // data is in the left sub tree.
root->left = Delete(root->left, data);
} else if (data > root->data) { // data is in the right sub tree.
root->right = Delete(root->right, data);
} else {
// case 1: no children
if (root->left == NULL && root->right == NULL) {
delete(root); // wipe out the memory, in C, use free function
root = NULL;
}
// case 2: one child (right)
else if (root->left == NULL) {
struct Node *temp = root; // save current node as a backup
root = root->right;
delete temp;
}
// case 3: one child (left)
else if (root->right == NULL) {
struct Node *temp = root; // save current node as a backup
root = root->left;
delete temp;
}
// case 4: two children
else {
struct Node *temp = FindMin(root->right); // find minimal value of right sub tree
root->data = temp->data; // duplicate the node
root->right = Delete(root->right, temp->data); // delete the duplicate node
}
}
return root; // parent node can update reference
}
問題:
1)爲什麼它是
if (data > root->data) { // data is in the left sub tree.
root->left = Delete(root->left, data);
它不應該是if(data < root->data)
? (同樣的兩行代碼之後)
2)函數返回一個指向節點的指針,這是否意味着在主函數中我必須做這樣的事情?
int main(){
struct Node *tree=malloc(sizeof(Node));
...
struct Node *new_tree=malloc(sizeof(Node));
new_tree= Delete(tree,24);
因此函數代替老樹新樹,而無需與VAL 24節點?如果我想的函數void類型,我應該使用雙指針?