İkili Ağaçlar - kodu ile izleme

oy
0

Aşağıda gösterilen ikili ağaç göz önüne alındığında, aşağıda gösterilen ikili ağacın düğümleri fonksiyonu A (kök) çağrılır varsayılarak ziyaret sırayı belirler. Gösterildiği gibi ağaç düğümleri ve işaretçileri tanımlanır varsayın. Kök 60. içeren düğümünü işaret olduğunu varsayalım bu soruna cevabım aşağıda verilmiştir. Doğru mu? Neyi yanlış yaptım?

                                   60
                                 /    \
                                30     90
                               /  \   / 
                              5   38  77
                               \  /  / \
                               8 32 62  88



struct treeNode{
  int data;
  struct treeNode *left, *right:
  {

struct treeNode *tree_ptr;

void A(struct treeNode *node_ptr){
    if (node_ptr != NULL){
    printf(“%d ,”,node_ptr->data);
    B(node_ptr->left);
    B(node_ptr->right);
   }   
}

void B(struct treeNode *node_ptr){
    if (node_ptr != NULL) {
    A(node_ptr->left);
    printf(“%d ,”,node_ptr->data);
    A(node_ptr->right);
   }
 }   

Cevap: O kadar 60 yazdırıldığından ilk baskı node_ptr-> verilere diyor hükümsüz A'da Sonra fonksiyonu A çağrılır, daha sonra B dahilinde (sol node_ptr->) B çağırır (node_ptr-> sol) daha sonra yazdırmak olduğunu 5'tir veri . sonra (node_ptr-> sağ) çağrılan bir geri verileri sayesinde 8 baskılı alır A, baskı kadar gidin. Şimdi Im çok emin değilim ne yapması gerektiğini ama mantıken bu anlamda yazdırmak kılacak olsun 30 ama ptr 8'den 30'a Ve aynı desen 38 devam ederse o zaman basılmış alır ve 32 baskılı alır alır Im değil emin nasıl. Sağ alt ağaç için ... 90 77 62 88

Oluştur 14/12/2010 saat 22:05
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
1

Yeni başlayanlar için, kodunuz içinde hatalar bir demet vardır. Ben bu gibi olmalıyım tahmin ediyorum:

struct treeNode{
  int data;
  struct treeNode *left, *right;
}

treeNode *tree_ptr;

void A(treeNode *node_ptr){
    if (node_ptr != NULL){  /// this could be just if(node_ptr)
        printf(“%d ,”,node_ptr->data);
        B(node_ptr->left);
        B(node_ptr->right);
    }   
}

void B(treeNode *node_ptr){
    if (node_ptr != NULL) {
        A(node_ptr->left);
        printf(“%d ,”,node_ptr->data);
        A(node_ptr->right);
    }
}   

Ayrıca iki farklı dolaşma algoritmalarını karıştırma ediyoruz. A()Ön sipariş olduğu B()in sırasıdır. A()ve B()birbirlerine değil diyen olmalıdır. (Yine bir başka neden gerçek değişken / yerine işlev adlarını kullanmak için A, Bve böyle.)

Cevap 14/12/2010 saat 22:11
kaynak kullanıcı

oy
1

Sadece zaman içinde tam yürütme yığını yazmak. Bunun gibi:

A(60)
  printf
  B(30)
    A(5)
      ...
    printf
    A(38)
      ...
  B(90)
    ...

(Okuyucuya bir egzersiz sol ağaç kalanı).

Sonra sadece printf ifadeleri sonuçlarını aşağı yazma, yukarıdan aşağıya doğru gidin.

Cevap 14/12/2010 saat 22:14
kaynak kullanıcı

oy
1

ABir ön sipariş geçişi ise, olduğu Bbir in sipariş geçişi olan.

Eğer baskı sırasını anlamaya yönelik kolay bir yolu düğümleri kendilerini ziyaret ettiğini bakmaktır. Genellikle ağacın dış çevresindeki bir taslak (kökünde başlayan ve ilk iki yönde hareket alt ağacın dayalı sola veya sağa hareketli) çizin. Ben ön sipariş geçişi yapıyorum, ben ben boyunca hareket olduğunda bir düğüm çıktısını onun dışında . Ben bir in-sipariş geçişi yapıyorum ben taşıdığınızda, sadece bir düğüm çıktısını altında kendisine (önce yaprakları baskı sona çünkü, sen sipariş geçişleri baktığınızda bu mantıklı; onlar taşımak ilk düğümleri vardır altında ) Eğer anahat çizerken. Ben bir post-düzen geçişi yapıyorum ben onun boyunca hareket sadece, ben bir düğüm çıktısını içeriden .

GÜNCELLEŞTİRME

nedeni 30 5 sonra basılmış alır ve 8 de buna tamamen ön sipariş geçişi gerçekleştiren olmamasıdır. Bir ön sipariş ve kendi bünyesindeki bir sipariş geçişi arasında atlama ediyoruz.

emri anlamaya kolay bir yolu aslında (Sık sık bir araya bilgiyi tutmak için kalem / kağıt kalem kullanın) kod içinden iz olarak geçer adımları not etmektir. Örneğin, böyle bir çağrı yığını yazmak yapabilirdi:

A(60)
  printf(60)
  call B(60.left)
    B(30)
      call A(30.left)
        A(5)
          printf(5)
          call B(5.left)
            B(null)
          call B(5.right)
            B(8)
              call A(8.left)
                A(null)
              printf(8)
              call A(8.right)
                A(null)
      printf(30)
      call A(30.right)
        A(38)
        ...

Kolayca düğümler daha da önemlisi, 30 (bir özyinelemeli çağrı sona ermiştir ve geri bir seviye düşüyoruz) baskı için yazdırma 8 den "jump" neden baskılı ve sırasını görebilirsiniz.

Cevap 14/12/2010 saat 22:15
kaynak kullanıcı

oy
1

60, 30, 5, 8 35 32 vs olarak - - 5, 8, 30, 32, 35, vb, yukarıda belirtildiği gibi iz ya Ön amacıyla ya da In-amacıyla ön doğru olamaz

Cevap 28/03/2011 saat 09:59
kaynak kullanıcı

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