drzewo binarne -print elementy w zależności od poziomu

głosy
6

To pytanie zadano mi w wywiadzie:

binarne

powiedzmy, że mamy nad drzewem binarnym, w jaki sposób można produkować wyjście jak poniżej

2 7 5 2 6 9 5 11 4

Odpowiedziałem, jak może być może mamy zmienną count poziom i wydrukować wszystkie elementy kolejno sprawdzając zmienną count poziomie każdego węzła. chyba się myliłem.

Czy ktoś może dać anyidea, w jaki sposób możemy to osiągnąć?

Utwórz 14/04/2011 o 08:07
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
2

Traversal w swoim pytaniu nazywa się level-order traversali to jest, jak to się robi (bardzo proste / czyste fragment kodu znalazłem).

Można w zasadzie używać kolejki i kolejność operacji będzie wyglądać mniej więcej tak:

enqueue F
dequeue F
enqueue B G
dequeue B
enqueue A D
dequeue G
enqueue I
dequeue A
dequeue D
enqueue C E
dequeue I
enqueue H
dequeue C
dequeue E
dequeue H

Na tym drzewie (prosto z Wikipedii):
wprowadzić opis obrazu tutaj

Odpowiedział 14/04/2011 o 08:14
źródło użytkownik

głosy
2

Określenie tego jest poziom rzędu przejścia . Wikipedia opisuje algorytm, który za pomocą kolejki :

levelorder(root) 
  q = empty queue
  q.enqueue(root)
  while not q.empty do
    node := q.dequeue()
    visit(node)
    if node.left ≠ null
      q.enqueue(node.left)
    if node.right ≠ null
      q.enqueue(node.right)
Odpowiedział 14/04/2011 o 08:14
źródło użytkownik

głosy
2

BFS :

std::queue<Node const *> q;
q.push(&root);
while (!q.empty()) {
    Node const *n = q.front();
    q.pop();
    std::cout << n->data << std::endl;
    if (n->left)
        q.push(n->left);
    if (n->right)
        q.push(n->right);
}

Iteracyjny pogłębienie również działa i oszczędza zużycie pamięci, ale kosztem czasu obliczeń.

Odpowiedział 14/04/2011 o 08:16
źródło użytkownik

głosy
6

Trzeba zrobić Szerokość pierwszego przechodzenie drzewa. Tutaj jest to opisane w następujący sposób:

Szerokość pierwszego przejścia: Głębokość pierwszego nie jest jedynym sposobem, aby przejść przez elementy drzewa. Innym sposobem jest przejść przez nich poziom-by-poziom.

Na przykład, każdy element występuje na pewnym poziomie (lub głębokość) w drzewie:

    tree
      ----
       j         <-- level 0
     /   \
    f      k     <-- level 1
  /   \      \
 a     h      z  <-- level 2
  \
   d             <-- level 3

Ludzie lubią ilość rzeczy, począwszy od dnia 0.)

Tak więc, jeśli chcemy odwiedzić elementy poziomu-by-poziomie (i od lewej do prawej, jak zwykle), chcemy rozpocząć na poziomie 0 z j, a następnie przejść do poziomu 1 dla F i K, a następnie przejść do poziomu 2 o, h, z, i w końcu przejść poziom 3 do d.

To przechodzenie poziom po poziomie nazywany jest szerokość pierwszego przejścia ponieważ badamy szerokość, czyli całą szerokość drzewa na danym poziomie, przed udaniem się głębiej.

Odpowiedział 14/04/2011 o 08:16
źródło użytkownik

głosy
0

Chciałbym użyć kolekcji, na przykład std::list, do przechowywania wszystkich elementów aktualnie drukowanego poziomie:

  1. Zbierz odnośniki do wszystkich węzłów w bieżącym poziomie w pojemniku
  2. Broszura węzły wymienione w kontenerze
  3. Tworzy nowy pojemnik, dodać podwęzły wszystkich węzłów w pojemniku
  4. Zastąpić stary pojemnik z nowym pojemnikiem
  5. powtarzać aż pojemnik jest pusty
Odpowiedział 14/04/2011 o 08:18
źródło użytkownik

głosy
0

jako przykład tego, co można zrobić w wywiadzie, jeśli nie pamiętam / nie wiem „oficjalnego” algorytmu, moja pierwsza myśl była - trawers drzewa w regularnych pre-order przeciąganie licznik poziomu wzdłuż, przy zachowaniu wektor linkowane listy wskaźników do węzłów na poziomie, na przykład

levels[level].push_back(&node);

a na koniec wydrukować listę każdym poziomie.

Odpowiedział 14/04/2011 o 08:39
źródło użytkownik

głosy
2

Jeśli jesteśmy w stanie sprowadzić następnego elementu na tym samym poziomie, jesteśmy gotowe. Zgodnie z naszym stanem wiedzy , możemy uzyskać dostęp do tych elementów za pomocą Szerokość pierwszego przechodzenie.

Teraz jedynym problemem jest to, jak sprawdzić, czy jesteśmy na ostatnim elementem na każdym poziomie. Z tego powodu powinniśmy być dołączenie separatora (null w tym przypadku), aby zaznaczyć koniec poziomu.

Algorytm: 1. korzeń Put w kolejce.
2. Nałożyć NULL w kolejce.
3. Podczas gdy kolejka nie jest pusta,
4 x = pobrać pierwszy element z kolejki
5. Jeśli x jest NULL
6. X> rpeer <góry elementu kolejki.
7. Nałożyć lewy i prawy X, dziecko w kolejce
8. inny
9. Jeśli kolejka nie jest pusty
10. umieścić pusta w kolejce
11 End If
12. końca podczas
13. powrotu

#include <queue>

void print(tree* root)
{
  queue<tree*> que;
  if (!root)
      return;

  tree *tmp, *l, *r;
  que.push(root);
  que.push(NULL);

  while( !que.empty() )
  {
      tmp = que.front();
      que.pop();
      if(tmp != NULL)
      {
          cout << tmp=>val;  //print value
          l = tmp->left;
          r = tmp->right;
          if(l) que.push(l);
          if(r) que.push(r);
      }
      else
      {
          if (!que.empty())
              que.push(NULL);
      }
  }
  return;
}
Odpowiedział 14/04/2011 o 11:55
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more