Sadece ön siparişe veya postorder kastetmek bir BST İç yolu uzunluğunu hesaplamak

oy
3

Merhaba StackOverflow topluluk!

Ben sadece ön sipariş veya ağaç oluşturulmadan olmadan postorder geçişi (pek bir fark olmamalıdır) verilen BST iç yol uzunluğunu hesaplamak anlamaya çalışıyorum; yani ben yukarıda belirtilen geçişleri yalnızca birini kullanmak istiyoruz. Bu Çoğunuz basit bir cevabı olabilir ama sen de kabul edeceğiniz gibi ben ağaçlara oldukça yeniyim.

Eh herhangi bir düşünce takdir ve teşekkür edilir.

Oluştur 23/02/2011 saat 06:01
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
-1

Sorununu anlamak mümkün olmayabilir. iki ağacı düşünün

   A         A
  / \        |
 B   C       B
             |
             C

Aynı ön sipariş geçişi (ABC), fakat farklı iç yol uzunlukları (2 ve 3) sahiptir.

Cevap 23/02/2011 saat 06:44
kaynak kullanıcı

oy
0

Bir sayfa vardır http://geeksforgeeks.org/?p=6633 geçişleri onun ön siparişe gelen ve sıralı bir ağaç oluşturmaktan bahsetmektedir. Ağacınızı bir arama ağacı olduğundan Burada, sen örtülü de sipariş geçişi (kullanarak tuşların sıralama düzeni) var. Daha sonra iç yol uzunluğunu elde etmek için birlikte seviyelerini ekleyin (ağacı oluşturmak gerek kalmadan) her ağacın düğüm düzeyini hesaplamak için o bölgede gibi bir özyinelemeli algoritmayı kullanabilir. Her düğümün sağ çocuğu bulmak için kastetmek üzerinde arama yapar beri bu algoritma, en verimli olmayabilir, ama çalışması gerekir. Bu, tek geçişli algoritmasını (varsayarak bütün tuşlar ayrıdır) nasıl yapılacağına ilişkin en iyi benim tahminim:

int internal_path_length(key_iter& cur_node, key_iter end, int level, key max_key) {
  if (cur_node == end) return 0;
  key cur_key = *cur_node;
  if (cur_key > max_key) return 0;
  ++cur_node;
  int len1 = internal_path_length(cur_node, end, level + 1, cur_key);
  int len2 = internal_path_length(cur_node, end, level + 1, max_key);
  return len1 + len2 + level;
}

İle başla:

key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);

nerede mksenin ağaçta olası en büyük anahtarının daha büyüktür.

Cevap 23/02/2011 saat 06:48
kaynak kullanıcı

oy
0

onun bir BST beri örtük ağacın kastetmek inorder (elementlerin sıralanmış listesini) sahip olması.

Sadece preorder dan Biz benzersiz ağacı oluşturabilir veya postorder geçişi Öncesi [R, R daha az elementlerin listesi R sonra daha büyük elementlerin listesi] mesaj olacak [R daha az elementlerin listesi, Ar sonra elemanların büyük listesi olacak R]

Sözde kod aşağıdaki gibi görünecektir.

findIPLPreOrder(poArray,startIndex,endIndex, height) {
     if(startIndex==endIndex){
          retrn height;
     }
     m=findIndexOfEndofLeftSubTree(poArray,start,end);
     return findIPLPreOrder(poArray,start+1,m,height + 1) + findIPLPreOrder(poArray,m+1,end,height + 1);     
}

findIndexOfEndofLeftSubTree(poArray,start,end){
  R=poArray[start]
  for(i=start+1;i<=end;i++){
     if(R < poArray[i]){
         return i-1;
       }
  }
}
Cevap 23/02/2011 saat 06:52
kaynak kullanıcı

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