Szukaj…


Uwagi

Drzewa są podkategorią lub podtypem grafów na krawędziach węzłów. Są wszechobecne w informatyce ze względu na ich powszechność jako modelu dla wielu różnych struktur algorytmicznych, które z kolei są stosowane w wielu różnych algorytmach

Wprowadzenie

Drzewa są podtypem bardziej ogólnej struktury danych grafowych na krawędziach węzłów.

Drzewo wyszukiwania binarnego.

Aby być drzewem, wykres musi spełniać dwa wymagania:

  • To jest acykliczne. Nie zawiera cykli (ani „pętli”).
  • Jest podłączony. Każdy węzeł na wykresie jest dostępny dla każdego węzła. Wszystkie węzły są osiągalne jedną ścieżką na wykresie.

Struktura danych drzewa jest dość powszechna w informatyce. Drzewa są używane do modelowania wielu różnych struktur danych algorytmicznych, takich jak zwykłe drzewa binarne, drzewa czerwono-czarne, drzewa B, drzewa AB, drzewa 23, sterty i próby.

Powszechnie nazywa się Drzewo Drzewem Rooted Tree przez:

choosing 1 cell to be called `Root`
painting the `Root` at the top
creating lower layer for each cell in the graph depending on their distance from the root -the bigger the distance, the lower the cells (example above)

wspólny symbol drzew: T

Typowa reprezentacja drzewa anarynowego

Zazwyczaj reprezentujemy drzewo anaryjne (jedno z potencjalnie nieograniczoną liczbą potomków na węzeł) jako drzewo binarne (jedno z dokładnie dwoma potomkami na węzeł). „Następne” dziecko jest uważane za rodzeństwo. Zauważ, że jeśli drzewo jest binarne, reprezentacja ta tworzy dodatkowe węzły.

Następnie iterujemy po rodzeństwie i wracamy do dzieci. Ponieważ większość drzew jest stosunkowo płytka - wiele dzieci, ale tylko kilka poziomów hierarchii, daje to początek wydajnemu kodowi. Uwaga: genealogie ludzkie są wyjątkiem (wiele poziomów przodków, tylko kilka dzieci na poziom).

W razie potrzeby można zachować wskaźniki cofania, aby umożliwić wstąpienie do drzewa. Są trudniejsze do utrzymania.

Zauważ, że typowe jest posiadanie jednej funkcji do wywoływania w katalogu głównym i funkcji rekurencyjnej z dodatkowymi parametrami, w tym przypadku głębokością drzewa.

  struct node
  {
     struct node *next;
     struct node *child;
     std::string data;
  }

  void printtree_r(struct node *node, int depth)
  {
     int i;

     while(node)
     {
         if(node->child)
         {
            for(i=0;i<depth*3;i++)
                printf(" ");
            printf("{\n"):
            printtree_r(node->child, depth +1);
            for(i=0;i<depth*3;i++)
                printf(" ");
            printf("{\n"):
    
            for(i=0;i<depth*3;i++)
               printf(" ");
             printf("%s\n", node->data.c_str());

             node = node->next;
          }
      }
  }

  void printtree(node *root)
  {
     printree_r(root, 0);
  }

Aby sprawdzić, czy dwa drzewa binarne są takie same, czy nie

  1. Na przykład, jeśli dane wejściowe to:

Przykład 1

za)

wprowadź opis zdjęcia tutaj

b)

wprowadź opis zdjęcia tutaj

Dane wyjściowe powinny być prawdziwe.

Przykład: 2

Jeśli dane wejściowe to:

za)

wprowadź opis zdjęcia tutaj

b)

wprowadź opis zdjęcia tutaj

Dane wyjściowe powinny być fałszywe.

Pseudo kod dla tego samego:

boolean sameTree(node root1, node root2){

if(root1 == NULL && root2 == NULL)
return true;

if(root1 == NULL || root2 == NULL)
return false;

if(root1->data == root2->data 
     && sameTree(root1->left,root2->left)
        && sameTree(root1->right, root2->right))
return true;

}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow