arbore binar -PRINT elementele în funcție de nivelul

voturi
6

Această întrebare a fost rugat să-mi într-un interviu:

arbore

vă permite să spunem că avem de mai sus arbore binar, cum pot produce o ieșire ca mai jos

2 7 5 2 6 9 5 11 4

I-am răspuns ca poate fi o putem avea un număr variabil de nivel și a imprima toate elementele secvențial prin verificarea variabilei count nivelul fiecărui nod. Probabil am fost greșit.

poate cineva da anyidea cu privire la modul în care putem realiza acest lucru?

Întrebat 14/04/2011 la 08:07
sursa de către utilizator
În alte limbi...                            


7 răspunsuri

voturi
2

Traversare în întrebarea dumneavoastră se numește level-order traversalși acest lucru este modul în care se face (curat fragment foarte simplu / cod am găsit).

Utilizați practic o coadă și ordinea operațiilor va arata ceva de genul:

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

Pentru acest copac (direct de la Wikipedia):
introduceți descrierea imaginii aici

Publicat 14/04/2011 la 08:14
sursa de către utilizator

voturi
2

Termenul pentru care este la nivel de comandă traversal . Wikipedia descrie un algoritm pentru că folosind o coadă :

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)
Publicat 14/04/2011 la 08:14
sursa de către utilizator

voturi
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);
}

aprofundare Iterativ ar lucra, de asemenea, și salvează utilizarea de memorie, dar în detrimentul timpului de calcul.

Publicat 14/04/2011 la 08:16
sursa de către utilizator

voturi
6

Trebuie să faci un prim traversal lățimea de copac. Aici este descrisă după cum urmează:

Latime-prima parcurgeri: adancime nu este singura modalitate de a trece prin elementele unui copac. O altă modalitate este de a merge prin intermediul lor la nivel-cu-nivel.

De exemplu, fiecare element există la un anumit nivel (sau adâncime) în copac:

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

oameni ca la numărul de lucruri începând cu 0.)

Deci, dacă vrem să viziteze elementele de nivel-cu-nivel (și de la stânga la dreapta, ca de obicei), ne-ar începe la nivelul 0 cu j, apoi du-te la nivelul 1 pentru f și k, apoi du-te la nivelul 2 o, h și z, și în cele din urmă du-te la nivelul 3 pentru d.

Acest traversal nivel de nivel se numește o lățime mai întâi parcurgeri pentru că am explora lățimea, adică, întreaga lățime a arborelui la un anumit nivel, înainte de a merge mai adânc.

Publicat 14/04/2011 la 08:16
sursa de către utilizator

voturi
0

Mi - ar folosi o colecție, de exemplu std::list, pentru a stoca toate elementele nivelului imprimat în prezent:

  1. Colecta indicii pentru toate nodurile din nivelul actual în container
  2. Imprimați nodurile enumerate în container
  3. Asigurați-un container nou, adăugați subnoduri tuturor nodurilor din container
  4. Suprascrieți recipientul vechi cu noul container
  5. se repetă până când containerul este gol
Publicat 14/04/2011 la 08:18
sursa de către utilizator

voturi
0

ca un exemplu de ceea ce se poate face la un interviu, dacă nu vă amintiți / nu știu algoritmul „oficial“, prima mea idee a fost - traversa copac în mod regulat precomanda trăgând un contor de nivel de-a lungul, menținerea vector legate liste de indicii pentru noduri per nivel, de exemplu,

levels[level].push_back(&node);

iar în final imprima lista fiecărui nivel.

Publicat 14/04/2011 la 08:39
sursa de către utilizator

voturi
2

Dacă suntem capabili să -i aducă elementul următor , la același nivel, am terminat. Conform cunoștințelor noastre anterioare , putem accesa aceste elemente utilizând primul traversal lățime.

Acum, singura problemă este modul de a verifica dacă suntem la ultimul element de la orice nivel. Din acest motiv, ar trebui să fie un delimitator adăugarea (NULL în acest caz) pentru a marca sfârșitul unui nivel.

Algoritm: 1. Pune rădăcină în coadă.
2. Pune NULL în coadă.
3. Deși Coadă nu este gol
4. x = fetch prim element din coadă
5. Dacă x nu este NULL
6. x-> rpeer <= elementul superior al coadă.
7. pune la stânga și la dreapta a lui x copil în coadă
8. altceva
9. în cazul în care coada de așteptare nu este gol
10. pune NULL în coadă
11. final dacă
12. capăt în timp ce
13. retur

#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;
}
Publicat 14/04/2011 la 11:55
sursa de către utilizator

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