Другие языки программирования и технологии

Построение бинарного дерева (С/С++)

Необходимо построить бинарное дерево так, чтобы все элементы с большими ключами располагались выше элементов с меньшими ключами.
попробуй поискать в гугле бинарная куча
АМ
Андрей Макаров
2 978
Лучший ответ
На Си:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct btt {
int v;
struct btt *l;
struct btt *r;
} btt, *btp, **bpp;

#define anc(n, v) do { n = malloc(sizeof(*n)); n->l = 0; n->r = 0; n->v = v; } while (0)

void bins(bpp b, int v) {
if (*b) {
if (v < (*b)->v) {
if ( (*b)->l ) {
bins(&((*b)->l), v);
} else {
anc((*b)->l, v);
}
} else {
if ( (*b)->r ) {
bins(&((*b)->r), v);
} else {
anc((*b)->r, v);
}
}
} else {
anc((*b), v);
}
}

btp bfnd(btp b, int v) {
if (b) {
if (v == b->v) {
return b;
}
if (v > b->v) {
return bfnd(b->r, v);
}
if (v < b->v) {
return bfnd(b->l, v);
}
}
return 0;
}

#define cpf(d, s) \
do { (d)->v = (s)->v; (d)->l = (s)->l; (d)->r = (s)->r; free(s); } while(0)

void bdel(bpp b, int v) {
if (*b) {
if (v > (*b)->v) {
bdel(&((*b)->r), v);
}
if (v < (*b)->v) {
bdel(&((*b)->l), v);
}
if (v == (*b)->v) {
btp d;
if ( (*b)->l && (*b)->r ) {
d = (*b)->r;
while (d->l) {
d = d->l;
}
(*b)->v = d->v;
bdel(&((*b)->r), v);
} else if ( (*b)->l ) {
d = (*b)->l;
cpf((*b), d);
} else if ( (*b)->r ) {
d = (*b)->r;
cpf((*b), d);
} else {
free(*b);
*b = 0;
}
}
}
return;
}

void btrv(btp b) {
if (b) {
btrv(b->l);
printf("M", b->v);
btrv(b->r);
}
}

#define gi() atoi(fgets(ch, sizeof(ch), stdin))

int main() {
int n;
int run = 1;
btp b = 0;
btp w = 0;
char ch[128];
srand(time(NULL));
for (n = 0; n < 100; n++) {
bins(&b, rand() % 1000);
}
while (run) {
char c;
printf("? ");
c = getchar();
if (c != '\n') {
getchar();
}
switch (c) {
case 's':
printf("n? ");
w = bfnd(b, gi());
printf(w ? "found: %""d\n" : "not found\n", w? w->v : 0);
break;
case 'd':
printf("n? ");
bdel(&b, gi());
break;
case 'p':
btrv(b);
puts("");
break;
case 'q':
run = 0;
break;
default:
puts("available cmds: (s)earch, (a)dd, (d)el, (p)rint, (q)uit\n"
"sample: input 'p' and press 'enter' for print all records");
break;
}
}
return 0;
}

ЗЫ:
К сожалению, исходный код изрядно пострадал в плане читабельности из-за ограничений на количество символов в ответе.
Юра Коржавин
Юра Коржавин
87 851
Посоветуй преподу полечиться. Такое "дерево" в принципе невозможно, поскольку весь смысл этого алгоритма, что выше всех находятся средние величины, левее - меньше, правее - больше.
Тимур Chirkoff
Тимур Chirkoff
20 410
Дерево не строят, а сажают. А чё за бред в скобках ты написал = хз.
Хамид Абдулаев
Хамид Абдулаев
12 742