• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znajdź największe poddrzewo bez duplikatów w danym BST

Object Storage Arubacloud
0 głosów
74 wizyt
pytanie zadane 15 czerwca 2019 w C i C++ przez stanislaw.maksicki Nowicjusz (120 p.)
edycja 15 czerwca 2019 przez stanislaw.maksicki

Nowe wierzchołki wkładam do drzewa następująco: lewy < korzeń <= prawy. Przez ,,największe poddrzewo" rozumiem takie o największej wysokości.

Mój program działa następująco:

1. Zacznij od odwiedzenia korzenia

2. Zbadaj poddrzewo w każdym odwiedzonym wierzchołku, aby zobaczyc czy zawiera duplikaty, w     nastepujący sposob:

a) sprawdz czy prawy syn nie jest taki sam jak ojciec

b) jesli nie, to sprawdzaj kolejnych lewych synow

3. Jesli zawiera, zakolejkuj synow do kolejnego przejscia

4. Jesli nie, zbadaj wysokosc poddrzewa i wprowadz nowy element do listy

5. Znajdz element listy o największej wysokości.

Funckja sprawdzająca czy dane drzewo ma duplikaty działa poprawnie. Mam jednak problem z operacjami na liście, której elementami są wskazniki do korzeni poddrzew bez duplikatów.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#define MAX_Q_SIZE 500 

typedef struct vertex {
    int klucz;
    struct vertex *lewy;
    struct vertex *prawy;
} vertex, *pvertex;

typedef struct NondupeSubtree { //elementy kolejki priorytetowej
    struct vertex *root;
    //int height; // im wieksza, tym wiekszy priorytet
    struct NondupeSubtree *next;
} NondupeSubtree, *pNondupeSubtree; 

//.................................................................

int CzyMaDuplikaty_temp(pvertex v,int k);

int CzyMaDuplikaty(pvertex t){

    if(t==NULL)
        return 0;
    int k = t->klucz; 
    pvertex v = t->prawy;

    if(CzyMaDuplikaty_temp(v,k))
        return 1;
    // CzyWlasciwePoddrzewo_temp(t->prawy);
}

int CzyMaDuplikaty_temp(pvertex v,int k){
    //gdzie "v" to wskaznik korzenia prawego syna t
    //a "k" to t->klucz

    // puste poddrzewo jest ok 
    if (v==NULL)  
        return 0; 
    if (v->klucz == k) 
    // bo w programie wrzucam wartosci rowne korzeniowi do prawego poddrzewa
    // jesli dziecko jest rowne ojcowi, to mamy duplikat 
        return 1;
    //teraz w prawym poddrzewie sprawadzam czy nie ma po lewej stronie szukanego k
    if(v->klucz > k)
        return CzyMaDuplikaty_temp(v->lewy,k);  
}

int CzyMaDuplikaty_total(pvertex root) 
{ 
    int rear, front; 
    pvertex *queue = createQueue(&front, &rear); 
    pvertex temp_vertex = root; 


    while (temp_vertex) 
    { 
        if(CzyMaDuplikaty(temp_vertex))
            return 1;
        // Enqueue lewy child 
        if (temp_vertex->lewy) 
            enQueue(queue, &rear, temp_vertex->lewy); 

        // Enqueue prawy child 
        if (temp_vertex->prawy) 
            enQueue(queue, &rear, temp_vertex->prawy); 

        // Dequeue wierzcholek i robie z niego temp_vertex
        temp_vertex = deQueue(queue, &front); 
    } 
} 

pvertex MaxHeightTree(pNondupeSubtree head)
{
  pNondupeSubtree p, pmax;
  pmax = head;
  if(head)
    for(p = head->next; p; p = p->next)
      if(Height(p->root) > Height(pmax->root)) 
        pmax = p;
  return pmax->root;
} 

// /* Print all the elements in the linked list */
// void print(pNondupeSubtree head) {
//   pNondupeSubtree current_node = head;
//   while ( current_node != NULL) {
//     printf("%d ", current_node->data);
//     current_node = current_node->next;
//   }
// }
pvertex Funkcja(pvertex t, pNondupeSubtree pq) 
{ 
    int rear, front; 
    pvertex *queue = createQueue(&front, &rear); 
    pvertex temp_vertex = t; 


    while (temp_vertex){ 
        if(!CzyMaDuplikaty(temp_vertex)){
          printf("aaaaa");
            // if(isEmpty(&pq)){

            //     pq->next = newNode(temp_vertex);
            //     pq=pq->next;
            //     printf("aaa\n");
            // }
            pq->next = insert_top(temp_vertex, pq);
            pq=pq->next;
            MaxHeightTree(pq);
            temp_vertex = deQueue(queue, &front); 
        }


        else{

            //Kolejkuje lewe dziecko
            if (temp_vertex->lewy) 
                enQueue(queue, &rear, temp_vertex->lewy); 

            //Kolejkuje prawy dziecko 
            if (temp_vertex->prawy) 
                enQueue(queue, &rear, temp_vertex->prawy); 

            /*Dequeue vertex and make it temp_vertex*/
            temp_vertex = deQueue(queue, &front); 
        }
    }
     
}
int main()
{
  int input; 
  pNondupeSubtree head;
  head = (pNondupeSubtree)malloc(sizeof(NondupeSubtree)); 
  pvertex t, prev_t, next_t;
  t = (pvertex)malloc(sizeof(vertex));;

  /* Display Menu */
   
   printf("Dostepne komendy:\n");
    
        printf("1 <Stworz losowe drzewo BST.>\n");
        printf("2 <Wstaw wierchołek o danym kluczu.>\n");
        printf("3 <Czy drzewo ma duplikaty?>\n");
        printf("4 <Najwieksze drzewo bez duplikatow.>\n");
        printf("5 <Koniec.>\n");
        printf(".............................................\n");
    do{ 
        scanf("%d", &input);
     
        if (input == 1){
            int i;
            srand (time(NULL));


            printf("Wprowadz liczbę wierzchołków\n");
            int n;
            scanf("%d",&n);

            for (i = 0; i < n; i++)
                t = InsertBST(t, rand() % 1000);
            DisplayTree(t);
            continue;
        }         
        else if (input == 2){
            printf("Wprowadz klucz\n");
            int k;
            scanf("%d", &k);
                
            InsertBST(t, k);
            DisplayTree(t);
            continue;
        }

        else if (input == 3){
        
            if(CzyMaDuplikaty_total(t))
                printf("Drzewo ma duplikaty.\n");
            else
                printf("Drzewo nie ma duplikatow.\n");
            continue;
        }       

        else if (input ==4){
            printf("Najwieksze drzewo bez duplikatow to: \n");   
            DisplayTree(Funkcja(t, head));
            continue;

        }  
        else if (input == 5)
            break;
        else{
            printf("Prosze wprowadzic prawidlowe polecenie.\n"); 
            continue; 
        }    
    }while(input!= 5);

    return 0;
}       

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 129 wizyt
pytanie zadane 20 czerwca 2020 w C i C++ przez Rrafał98 Nowicjusz (240 p.)
0 głosów
1 odpowiedź 305 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 698 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...