• 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

0 głosów
97 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 163 wizyt
pytanie zadane 20 czerwca 2020 w C i C++ przez Rrafał98 Nowicjusz (240 p.)
0 głosów
1 odpowiedź 398 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,099 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...