#c #binary-search-tree #nodes
#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 amp;amp; 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);
Поэтому функция заменить старое дерево с нового дерева без узла с Валь-24?если я хочу, чтобы функция, чтобы быть типа Void я должен использовать двойные указатели?
Ответ №1:
Для вашего первого вопроса Вы имеете право должно быть: if(data < root->data)
. По второму вопросу не совсем так. Вы, очевидно, следует определить головной указатель, который является главой из дерева и создать функцию, которая вставляет данные по британскому летнему времени, так что эта функция делает Танос. Все, что вам СВАО в основном является головной указатель инициализирован в NULL в начале, так это должно выглядеть:
int main(){
struct Node *tree=NULL;
int number=...;
...
input_to_bst(amp;tree,number);
...
new_tree= Delete(tree,24);
Также, обратите внимание, что новое дерево не нужно Танос поскольку ваша функция возвращает указатель, который уже показывает на структуру и что вы делаете, заключается в том, что new_tree также точки этой структуры.
На ваш последний вопрос, Да, конечно, вы могли бы передать двойной указатель (на самом деле я следил за этим образом в определении input_to_bst(amp;tree);
).
Пример определения input_to_bst функция может быть:
void input_to_bst(treeptr* head,int number){
if((*head)==NULL){
(*head)=(treeptr)malloc(sizeof(struct tree));
(*head)->data=number;
(*head)->left=NULL;
(*head)->right=NULL;
}
else{
if(((*head)->data)>number) input_to_bst(amp;((*head)->left),number);
else (((*head)->data)<number) input_to_bst(amp;((*head)->right),number);
}
}
где мы предположим, что мы определили структуры:
struct tree{
int data;
struct tree* right;
struct tree* left;
};
typedef struct tree* treeptr;