Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
16.11.2025
Размер:
9.23 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
// dodelal udalenie kornya dereva
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 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 OP(pNode p) { // summa uzlov s 1 potomkom
    if (p!=NULL) {
            if(((p->left==NULL)&&(p->right!=NULL)||((p->left!=NULL)&&(p->right==NULL)))){
                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 outputBreadth(pNode p) { // vivod dereva v shirinu
    int k;
    Levels(p);
    for(k=0; k<=t; k++){
        j=-1;
        Level(p, k);
    }
}
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);
            }
    }
}
pNode found=NULL;
void find(pNode p, int val) { // poisk
    if (p!=NULL) {
            if(p->key==val) found=p;
            find(p->left, val);
            find(p->right, val);
            }
}
void delEl(pNode p, pNode pk){ // udalenie uzla po adresu
    pNode q;
    if((p==NULL)||(pk==NULL)) return;
    if(p==pk){ // dlya nachalnogo uzla
            if(((pk->left)==NULL)&&((pk->right)==NULL)){ // sluchai 1
                    p=NULL;
                    found=NULL;
                    return;
                }
            else if(((pk->left)==NULL)&&((pk->right)!=NULL)){ // sluchai 2, right
                    pk->key=pk->right->key;
                    pk->left=pk->right->left;
                    pk->right=pk->right->right;
                    found=NULL;
                    return;
                }
            else if(((pk->left)!=NULL)&&((pk->right)==NULL)){ // sluchai 2, left
                    pk->key=pk->left->key;
                    pk->right=pk->left->right;
                    pk->left=pk->left->left;
                    found=NULL;
                    return;
                }
            else{ // sluchai 3
                if(pk->right->left==NULL){
                        pk->key=pk->right->key;
                        pk->right=pk->right->right;
                        found=NULL;
                        return;
                    }
                else{
                        q=pk->right;
                        while(q->left!=NULL){
                            q=q->left;
                        }
                        pk->key=q->key;
                        q=pk->right;
                        while(q->left->left!=NULL){
                            q=q->left;
                            }
                        q->left=NULL;
                        found=NULL;
                        return;
                    }
                }
    }
    else {
            if(p->left==pk){
                if(((pk->left)==NULL)&&((pk->right)==NULL)){ // sluchai 1
                    p->left=NULL;
                    found=NULL;
                    return;
                }
                else if(((pk->left)==NULL)&&((pk->right)!=NULL)){ // sluchai 2, right
                    p->left=pk->right;
                    found=NULL;
                    return;
                }
                else if(((pk->left)!=NULL)&&((pk->right)==NULL)){ // sluchai 2, left
                    p->left=pk->left;
                    found=NULL;
                    return;
                }
                else{ // sluchai 3
                    if(pk->right->left==NULL){
                        pk->key=pk->right->key;
                        pk->right=pk->right->right;
                        found=NULL;
                        return;
                    }
                    else{
                        q=pk->right;
                        while(q->left!=NULL){
                            q=q->left;
                        }
                        pk->key=q->key;
                        q=pk->right;
                        while(q->left->left!=NULL){
                            q=q->left;
                        }
                        q->left=NULL;
                        found=NULL;
                        return;
                    }
                }
            }
            else if(p->right==pk){
                if(((pk->left)==NULL)&&((pk->right)==NULL)){ // sluchai 1
                    p->right=NULL;
                    found=NULL;
                    return;
                }
                else if(((pk->left)==NULL)&&((pk->right)!=NULL)){ // sluchai 2, right
                    p->right=pk->right;
                    found=NULL;
                    return;
                }
                else if(((pk->left)!=NULL)&&((pk->right)==NULL)){ // sluchai 2, left
                    p->right=pk->left;
                    found=NULL;
                    return;
                }
                else{ // sluchai 3
                    if(pk->right->left==NULL){
                        pk->key=pk->right->key;
                        pk->right=pk->right->right;
                        found=NULL;
                        return;
                    }
                    else{
                        q=pk->right;
                        while(q->left!=NULL){
                            q=q->left;
                        }
                        pk->key=q->key;
                        q=pk->right;
                        while(q->left->left!=NULL){
                            q=q->left;
                        }
                        q->left=NULL;
                        found=NULL;
                        return;
                    }
                }
            }
            delEl(p->left, pk);
            delEl(p->right, pk);
    }
}
void delElAB(pNode p, int a, int b){
    int k;
    for(k=a; k<=b; k++){
        find(p, k);
        if(found!=NULL) delEl(p, found);
        found=NULL;
    }
}
int main(void){
    printf("Numbers for tree: \n");
    int a, b, v;
    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);
    }
    v=getchar();
    printf("Deleting the number: \n");
    scanf("%d", &v);
    find(rt, v);
    outputLRN(rt);
    printf("\n");
    if(found!=NULL) delEl(rt, found);
    else printf("!\n");
    outputLRN(rt);
    OP(rt);
    printf("\n%d\n", s);
}
Соседние файлы в папке 3 семестр