Cod sursa(job #2771963)

Utilizator thinkphpAdrian Statescu thinkphp Data 30 august 2021 07:25:21
Problema Sortare prin comparare Scor 40
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <stdio.h>
#include <malloc.h>
#define FIN "algsort.in"
#define FOUT "algsort.out"

struct Node {

       int data;
       struct Node *left, *right;
};

struct Node* insert(struct Node *root, int data) {

      if(root == NULL) {

         root = (struct Node*)malloc(sizeof(struct Node));

         root->data = data;

         root->left = NULL;

         root->right = NULL;

      } else if(root->data > data) {

         root->left = insert(root->left, data);

      } else {

         root->right = insert(root->right, data);
      }

    return root;
};

struct Node *findMin(struct Node *root) {

       while(root->left != NULL) {

             root = root->left;
       }

   return root;
}

//method to vizit nodes in Inorder
void inorder(struct Node *root) {

     if(root != NULL) {

        inorder(root->left);

        printf("%d ", root->data);

        inorder(root->right);
     }
};

struct Node* del(struct Node *root, int x) {

       if(root == NULL) return root;

       else if(root->data > x) root->left = del(root->left, x);

            else if(root->data < x) root->right = del(root->right, x);

       else {

            //case 1: no child
            if(root->left == NULL && root->right == NULL) {

                free(root);

                root = NULL;

            //case 2: one child
            } else if(root->left == NULL) {

                    struct Node *temp = root;
                           root = root->right;
                           free(temp);

            } else if(root->right == NULL) {

                    struct Node *temp = root;
                           root = root->left;
                           free(temp);

            //case 3: two children
            } else if(root->left != NULL && root->right != NULL) {

                   struct Node *temp = findMin(root->right);
                          root->data = temp->data;
                          root->right = del(root->right, temp->data);
            }


       }

       return root;
};

int main() {

  freopen(FIN, "r", stdin);

  freopen(FOUT, "w", stdout);

    struct Node *root = NULL;

    int n, x;

    scanf("%d", &n);

    for(int i = 0; i < n; ++i)

        scanf("%d", &x),

        root = insert( root , x);

    inorder( root );

 return(0);
}