ikili ağaç düzeyine göre elemanlarını -print

oy
6

Bu soru bir röportajda bana istendi:

İkili

izin vermesini ben aşağıda şöyle bir çıktı üretebilir, biz ikili ağacın üstünde olması demek

2 7 5 2 6 9 5 11 4

i bir seviye sayısı değişkeni var ve her düğümün düzeyi sayımı değişkeni kontrol ederek sırayla tüm unsurları yazdırabilirsiniz olabilir gibi cevap verdi. Muhtemelen yanılmışım.

Herkes bunu başarmak nasıl olarak anyidea verebilir?

Oluştur 14/04/2011 saat 08:07
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
2

Sorunuzu geçişi bir denir level-order traversalve bu da (buldum çok basit / temiz kod parçacığını) böyle yapılır.

Temelde bir kuyruğu ve bu gibi bir şey olacaktır işlemlerin sırasını kullanın:

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

(Düz Wikipedia'dan) bu ağacın için:
Burada görüntü açıklama girin

Cevap 14/04/2011 saat 08:14
kaynak kullanıcı

oy
2

Bunun için terimdir seviye sipariş geçişi . Vikipedi açıklar ki kuyruğu kullanmak için bir algoritma :

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)
Cevap 14/04/2011 saat 08:14
kaynak kullanıcı

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

İteratif derinleşen da çalışmak ve hafıza kullanımını kaydeder, ancak zaman hesaplama pahasına olacaktır.

Cevap 14/04/2011 saat 08:16
kaynak kullanıcı

oy
6

Sen ağaç genişlik ilk geçişi yapmak gerekir. Burada şöyle açıklanır:

Genişlik-ilk geçişi: Derinlik öncelikli bir ağacın elemanlarının geçmesi için tek yol değildir. Başka yolu da içlerinden seviyesini bazında seviyeye gitmektir.

Örneğin, her bir element ağacındaki belirli bir düzeyde (ya da derinlik) yok:

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

0 ile başlatmak gibi sayı şeyler kişi)

Biz elemanları (her zamanki gibi ve soldan sağa) tarafından düzeyinde seviyesini-ziyaret etmek istiyorsak, biz j ile 0 seviyesinde başlayacaktı, sonra f ve k için seviye 1 gidin ve ardından 2. seviye gidin a, h ve z, ve son olarak da d seviye 3'e gidin.

daha derin gitmeden önce, belirli bir seviyede genişliğini, ağacın yani tam genişliği keşfetmek için bu seviye-by düzey geçişi bir genişlik öncelikli geçişi denir.

Cevap 14/04/2011 saat 08:16
kaynak kullanıcı

oy
0

Ben bir koleksiyon, örneğin kullanmak istiyorsunuz std::listşu anda basılmış seviyede tüm unsurları saklamak için:

  1. kapta mevcut düzeyi tüm düğümlere işaretçileri toplayın
  2. kap içinde listelenen düğümleri Baskı
  3. kapta bütün düğümlerin subnodes ekleyin yeni bir kapsayıcı olun
  4. Yeni konteyner ile eski kabı üzerine yaz
  5. kap boşalıncaya kadar tekrar
Cevap 14/04/2011 saat 08:18
kaynak kullanıcı

oy
0

Eğer "resmi" algoritma bilmiyorum / hatırlamıyorum eğer bir görüşmesinde neler yapabileceğini bir örnek olarak, benim ilk fikrimdi - boyunca bir seviye sayacı sürükleyerek düzenli ön sipariş ağacın travers, bir muhafaza işaretçiler bağlı listelerinin vektörü, seviye başına örneğin düğümler için

levels[level].push_back(&node);

ve sonunda her seviyenin listesini yazdırmak.

Cevap 14/04/2011 saat 08:39
kaynak kullanıcı

oy
2

Biz aynı seviyede bir sonraki eleman getirmek mümkün değilse, bitti. Gereğince bizim ön bilgi , biz genişlik ilk geçişi kullanarak bu eleman erişebilir.

Şimdi tek sorun biz herhangi bir seviyede son öğe de olup olmadığını kontrol etmek nasıl. Bu nedenle, biz bir seviyede sonunu işaretlemek için bir sınırlayıcı (bu durumda NULL) ekleme yapılmalıdır.

Algoritma: kuyrukta 1. koyun kökü.
Kuyrukta 2. koyun BOŞ.
Sıra boş değilse, 3. da
4. X = kuyruktan ilk elemanı getirme
x NULL değilse 5.
sıranın 6. x-> rpeer <= üst eleman.
7. koymak sol ve x sağ alt sıraya
başka 8.
sıra boş değilse, 9.
10 koymak NULL kuyrukta
11. ucu ise
ise 12. ucu
13 dönüş

#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;
}
Cevap 14/04/2011 saat 11:55
kaynak kullanıcı

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