나는 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) 함수는 노드에 대한 포인터를 반환합니다.이 함수는 주 기능에서 이와 같은 작업을 수행해야합니까? 나는 이중 포인터를 사용한다 함수가 void 형이 될하려는 경우
int main(){
struct Node *tree=malloc(sizeof(Node));
...
struct Node *new_tree=malloc(sizeof(Node));
new_tree= Delete(tree,24);
그래서 함수는?를 발 (24)와 노드 않고 새 트리 오래 된 나무를 대체?