Binární strom -print prvky, v závislosti na úrovni

hlasů
6

Tato otázka byla požádána, aby mi v rozhovoru:

binární

řekněme, že máme nad binárního stromu, jak mohu produkovat výstup podobný níže

2 7 5 2 6 9 5 11 4

i odpověděl podobně, mohou být můžeme mít počítat úroveň proměnné a vytisknout všechny prvky postupně kontrolou počítat úroveň proměnné každého uzlu. Asi jsem se mýlil.

může někdo dát anyidea, jak můžeme dosáhnout, že?

Položena 14/04/2011 v 08:07
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
2

Další předávání ve své otázce se nazývá level-order traversal, a to je to, jak se to dělá (velmi jednoduchý / čisté fragmentu kódu jsem našel).

Ty v podstatě používají frontu a pořadí operací bude vypadat nějak takto:

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

Z tohoto stromu (přímo z Wikipedie):
zadejte popis obrázku zde

Odpovězeno 14/04/2011 v 08:14
zdroj uživatelem

hlasů
2

Termín pro to je úroveň-order průchod . Wikipedia popisuje algoritmus pro které používáte frontu :

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)
Odpovězeno 14/04/2011 v 08:14
zdroj uživatelem

hlasů
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);
}

Iterativní prohlubování by také pracovat a šetří využití paměti, ale na úkor výpočetní čas.

Odpovězeno 14/04/2011 v 08:16
zdroj uživatelem

hlasů
6

Co musíte udělat, šíři první traversal stromu. Zde je popsána takto:

Do šířky traversal: hloubky Prvním z nich je to jediný způsob, jak projít prvky stromu. Další možností je jít přes ně pro vrstvené úrovni.

Například, existuje každý prvek na určité úrovni (nebo hloubka) ve stromu:

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

Lidé rádi počtu věcí začínající 0.)

Takže, pokud chceme navštívit Prvky pro vrstvené úrovni (a zleva doprava, jako obvykle), museli bychom začít na úrovni 0 s j, pak přejděte na úrovni 1 pro f a k, pak jít na úroveň 2 o, h a z, a nakonec jít do úrovně 3 pro d.

Tato úroveň podle jednotlivých úrovní traversal se nazývá šířky první průchod, protože jsme prozkoumat šíři, tj celé šířce stromu při dané úrovni, než jít hlouběji.

Odpovězeno 14/04/2011 v 08:16
zdroj uživatelem

hlasů
0

Chtěl bych použít sbírku, například std::list, pro uložení všech prvků v současné době tištěného úrovni:

  1. Shromažďují odkazy na všechny uzly v aktuální úrovni v kontejneru
  2. Vytisknout uzly uvedené v kontejneru
  3. Vytvořte nový obal, přidejte poduzlů všech uzlů v kontejneru
  4. Přepsat starý zásobník s novou nádobu
  5. opakujte, dokud nádoba je prázdná
Odpovězeno 14/04/2011 v 08:18
zdroj uživatelem

hlasů
0

Jako příklad toho, co můžete udělat v rozhovoru, pokud si nepamatujete / nevím „oficiální“ algoritmus, moje první myšlenka byla - traverz stromu v pravidelném předběžném pořadí přetahování počítadlo úrovně spolu, udržování vektor propojených seznamech ukazatelů na uzly na úrovni, např

levels[level].push_back(&node);

a nakonec vytisknout seznam každé úrovni.

Odpovězeno 14/04/2011 v 08:39
zdroj uživatelem

hlasů
2

Pokud jsme schopni načíst další prvek na stejné úrovni, jsme hotovi. Podle našich předchozích znalostí můžeme získat přístup k těmto prvek pomocí šíři první traversal.

Nyní Jediným problémem je, jak zjistit, jestli jsme v poslední prvek na všech úrovních. Z tohoto důvodu bychom měli být připojením oddělovač (NULL v tomto případě), u příležitosti konce úrovni.

Algoritmus: 1. Vložte kořen ve frontě.
2. Vložte NULL ve frontě.
3. Zatímco fronta není prázdná
4. x = načíst první prvek z fronty
5. Pokud x není NULL
6. x-> rpeer <= horní prvek z fronty.
7. put vlevo a vpravo dítě x ve frontě
8. jiný
9. Pokud fronta není prázdná
10. put NULL ve frontě
11. Pokud konec
12. Konec zatímco
13. návratu

#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;
}
Odpovězeno 14/04/2011 v 11:55
zdroj uživatelem

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