これは、BSTからノードを削除するためにオンラインで作成されたこの機能を理解しようとしていました。CノードのBSTからノードを削除
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行目のコードでも同じです)
2)関数はノードへのポインタを返します。これは主関数でこれを何かする必要があることを意味しますか?
int main(){
struct Node *tree=malloc(sizeof(Node));
...
struct Node *new_tree=malloc(sizeof(Node));
new_tree= Delete(tree,24);
ので機能は、私は関数はvoid型であるようにしたい場合、私は二重のポインタを使用する必要がありますか?valを24とノードなく、新しいツリーと古い木を置き換えますか?