Cod sursa(job #1528816)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 20 noiembrie 2015 03:42:10
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <algorithm>

#include <cstdio>
using namespace std;

const int MAX_N = 500002;

struct Tree {
    int value, cnt;
    Tree *leftSon, *rightSon;

    Tree() {
        value = -1;
        cnt = 0;
        leftSon = NULL;
        rightSon = NULL;
    }
};

void insertElement(Tree *node, int x) {
    if(node->value == x) {
        node->cnt++;
        return;
    }
    else if(node->value == -1) {
        node->value = x;
        node->cnt = 1;
        return;
    }
    else if(node->value > x) {
        if(node->leftSon == NULL) {
            node->leftSon = new Tree;
        }
        insertElement(node->leftSon, x);
    }
    else {
        if(node->rightSon == NULL) {
            node->rightSon = new Tree;
        }
        insertElement(node->rightSon, x);
    }
}

bool searchElement(Tree *node, int x) {
    if(node == NULL) {
        return false;
    }

    if(node->value == x) {
        return true;
    }
    else if(node->value > x) {
        return searchElement(node->leftSon, x);
    }
    else {
        return searchElement(node->rightSon, x);
    }
}

void printTree(Tree *node) {
    if(node == NULL) {
        return;
    }

    printTree(node->leftSon);
    for(int i = 0; i < node->cnt; ++i) {
        printf("%d ", node->value);
    }
    printTree(node->rightSon);
}

int main()
{
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    Tree *root = new Tree;

    int n;
    scanf("%d", &n);

    int v[MAX_N];
    for(int i = 0; i < n; ++i) {
        scanf("%d", &v[i]);
    }

    random_shuffle(v, v + n);
    for(int i = 0; i < n; ++i) {
        insertElement(root, v[i]);
    }

    printTree(root);
    printf("\n");

    fclose(stdin);
    fclose(stdout);

    return 0;
}