Добавил:
okley
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:3 семестр / lab21
.c#include <stdio.h>
#include <stdlib.h>
// samie bazovie functii zdes - vzyati iz metodicheskih materialov
typedef struct node { // uzel
int key;
struct node *left;
struct node *right;
} Node;
int i=-1, j=-1; // dlya podscheta urovney (-1, a ne 0, tak kak koren ne schitaem - eto nulevoy uroven')
int t=-2; // dlya sravneniya kol-va urovney
int s=0; // summa
typedef Node *pNode; // ukazatel na uzel
void insert(pNode *p, int val) { // dobavit element v uzel
if (*p == NULL) {
*p = (Node *) malloc(sizeof(Node));
(*p)->key = val;
(*p)->left = NULL;
(*p)->right = NULL;
}
else {
if (val < (*p)->key)
insert(&((*p)->left), val);
else
insert(&((*p)->right), val);
}
}
void outputNLR(pNode p) { // vivod dereva po pryamomu obhodu
if (p!=NULL) {
printf("%3d", p->key);
outputNLR(p->left);
outputNLR(p->right);
}
}
void outputLNR(pNode p) { // vivod dereva po simmetrichnomu poryadky
if (p!=NULL) {
outputLNR(p->left);
printf("%3d", p->key);
outputLNR(p->right);
}
}
void outputLRN(pNode p) { // vivod dereva po obratnomu obhodu
if (p!=NULL) {
outputLRN(p->left);
outputLRN(p->right);
printf("%3d", p->key);
}
}
void outputBreadth(pNode p) { // vivod dereva v shirinu
int k;
Levels(p);
for(k=0; k<=t; k++){
j=-1;
Level(p, k);
}
}
void Level(pNode p, int LVL) { // vivod elementov s 1 urovnya (pod nomerom LVL)
if (p!=NULL) {
j++;
if(j==LVL){
printf("%3d", p->key);
}
Level(p->left, LVL);
Level(p->right, LVL);
j--;
}
}
void P(pNode p) {
if (p!=NULL) {
P(p->left);
P(p->right);
}
}
void OP(pNode p) { // summa uzlov s 1 potomkom
if (p!=NULL) {
if(((p->left==NULL)&&(p->right!=NULL)||((p->left!=NULL)&&(p->right==NULL)))){
// printf("%d\n", p->key); otladka
s+=p->key;
}
OP(p->left);
OP(p->right);
}
}
void Levels(pNode p) {
if (p!=NULL) {
i++; // dobavit' pokazatel urovnya
Levels(p->left);
Levels(p->right);
if((p->left==NULL)&&(p->right==NULL)){
/* otladka poiska list'ev (net potomkov)
printf("\n%d ur = %d\n", p->key, i);
*/
if(i>t) t=i;
}
i--; // ubavit' pokazatel urovnya, tak kak vozvrat obratno, vverh
}
}
void del(pNode *p) { // udalenie vsego dereva
if (*p==NULL) return;
del(&((*p)->right));
del(&((*p)->left));
(*p)=NULL;
}
void rand_insert(pNode *p, int a, int b, int n){ // dobavit. sluchaynoe chislo
int i, r; // rand()%x = {0.. (x-1)}, rand()%(b-a+1) = {0.. b-a}, rand()%(b-a+1) + a = {a.. b} - to, chto nam nado;
for(i=0; i<n; i++){
r=rand()%(b-a+1)+a;
if (*p == NULL) {
*p = (Node *) malloc(sizeof(Node));
(*p)->key = r;
(*p)->left = NULL;
(*p)->right = NULL;
}
else {
if (r < (*p)->key)
insert(&((*p)->left), r);
else
insert(&((*p)->right), r);
}
}
}
int main(void){
int a, b;
pNode rt; // koren' (nachalo dereva)
rt = NULL;
a=scanf("%d", &b); // boolean: esli chislo, daet true, elsi bukva (v tom chisle "n" - to false)
insert(&rt, b);
while(a){ // zapolnenie
a=scanf("%d", &b);
if(a) insert(&rt, b);
}
outputLRN(rt);
OP(rt);
printf("\n%d\n", s);
/* Otladka poiska urovney
printf("Max = %d\n", t);
*/
// outputBreadth(rt); vivod v shirinu
/* Otladka udaleniya
printf("!\n");
del(&rt);
printf("!\n");
outputLRN(rt);
*/
/* Otladka random
rand_insert(&rt, 50, 99, 8);
outputLNR(rt); - vivodit po simm. poryadku ---> dolzshno bit' po vozrastaniyu (iz metodichki)
*/
}
Соседние файлы в папке 3 семестр
