Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
16.11.2025
Размер:
4.44 Кб
Скачать
#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 семестр