Удалить узел из по британскому летнему времени в C

#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;