Bir BST içinde kth küçük değeri bulma

oy
0

Burada bir ikili arama ağacında kth küçük değeri bulmak zorunda budur:

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

int rank(stuct treeNode* ptr, int k)
{
   if(node == NULL)
    return root; 

   while(ptr->left != NULL) {
     ptr = ptr->left;
     return rank(ptr->left)
   }
}

Bu tabii ki doğru değil. çözüm sağlayan olmadan, birileri bunu nasıl çözebileceklerini olarak doğru yönde bana yol olabilir? Ben BST içinde kth küçük elemanı bulabiliriz nasıl bulmaktan sorun yaşıyorum.

Oluştur 03/05/2011 saat 02:17
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Bu çalışmalı:

int rank(struct treeNode* n,int k,int* chk)
    {
    if(!n) return -1;
    int _chk = 0;
    if(!chk) chk = &_chk;

    int t = rank(n->left,k,chk);
    if(t>=0) return t;

    if(++*chk > k) return n->data;

    int t = rank(n->right,k,chk);
    if(t>=0) return t;
    return -1;
    }

olarak çağrı rank(root,k,0)

Cevap 03/05/2011 saat 02:35
kaynak kullanıcı

oy
1

Eğer alt ağaçlar her birinin boyutları, bu bir diziye veri okumak zorunda (veya başka bir ağaç geçme) ve yukarı saymadan yapılabilir olabilir. Eğer kullanışlı boyutu bilgisini tutmak yoksa, sen boyutunu hesaplamak için bir yardımcı işlevi gerekir.

Temel fikir, akım düğümün endeksidir anlamaya. o k azsa, sola alt ağacı arama yapmak gerekir. o k büyükse, sol ve akımından sayılır düğümleri mahsup hakkına arayın. Bu temelde biz endeksi değil, veri tarafından arıyorsunuz bu sefer hariç, düzenli BST üzerinden arama ile aynı olduğuna dikkat edin. Bazı yalancı kod:

if size of left subtree is equal to k:
    // the current node is kth
    return data of current node
else if size of left subtree is greater than k:
    // the kth node is on the left
    repeat on the left subtree
else if size of left subtree is less than k:
    // the kth node is on the right
    reduce k by the size of the left subtree + 1 // need to find the (k')th node on the right subtree
    repeat on the right subtree

(Aramada önemli değil hatta veri hakkında endişelenmeyin) işaretli endeksleri ile bu ağaç ele alalım:

        3
      /   \
     2     6
    /     / \
   0     4   7
    \     \
     1     5

Biz 2'nci (k = 2) bulmak istediğinizi varsayalım.
3'te başlayarak, sol alt ağaç boyutu 3'tür
yüzden k sol alt ağaç hareket daha büyüktür.
Sol alt ağacın büyüklüğü 2'dir
k yüzden şimdiki düğüm 2 olmalıdır da 2'dir.

Biz 4th (k = 4) bulmak istediğinizi varsayalım.
3'te başlayarak, sol alt ağaç boyutu 3'tür
O ( 'k = 4 - (3 + 1)), böylece 0 olduğu yeni k ayarlamak l'den az olan ve hemen alt ağacı hareket eder.
6 başlayarak, sol alt ağaç büyüklüğü 2'dir
Bu k'dan daha büyük olan'(0) böylece sol alt ağacı hareket eder.
Sol alt ağacın büyüklüğü 0'dır
'k 0 yüzden şimdiki düğüm 4 olmalıdır da.

Kaptın bu işi.

Cevap 03/05/2011 saat 02:45
kaynak kullanıcı

oy
5

Bir BST Sıralanmış ikili ağaç, sıralı düğüm değerlerini verecek bir in-sipariş geçişi (sol alt ağaç, şimdiki düğüm, sağ alt ağaç) 'dir. kth en küçük düğüm bulmak için, önce bir sayaç ile bir in-sipariş geçişi yapmak. Sayaç k ulaştığında, düğüm küçük k'inci biri, bir düğüm geçtiği zaman, tek arttırmak, 0 ile başlar.

Cevap 03/05/2011 saat 02:47
kaynak kullanıcı

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