Nasıl AVL ağacında bir düğüm sırasını bulmak için?

oy
4

İki rütbe sorguları [uygulamak gerekir rank(k)ve select(r)]. Bu konuda başlamadan önce, ben iki işlev nasıl çalıştığını anlamaya ihtiyacımız var.

Gibi bildiğim kadarıyla, rank(k)belirli bir anahtar rütbesi verir kve select(r)belirli bir değerde anahtarını döndürür r.

Yani benim sorular şunlardır:

1.) nasıl) AVL (kendinden dengeleme BST bir düğümün sıralaması hesaplarım?

2.) birden fazla anahtar aynı dereceye sahip mümkün mü? Ve eğer öyleyse, ne woulud select(r)dönmek?

Ben bunu soruya cevap yardımcı olup olmadığını belirtebilir örnek bir AVL ağacı içerecek şekilde gidiyorum.

Burada

Teşekkürler!

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


4 cevaplar

oy
3

Sorunuz gerçekten aşağı kaynar: "terimi sıralaması 'normalde AVL ağacında göre nasıl tanımlandığı?" (Ve muhtemelen ne kadar 'seçeneğini' normalde de tanımlandığı gibidir).

yani birçok düğümler sola onun için ne kadar - kullandığım terim gördüğüm en azından, "rütbe" ağacında düğümler arasındaki konumunu ifade eder. Genellikle bir düğüm (ya da belki bir anahtar değeri) için bir işaretçi verilen ve onun solunda düğümlerin sayısını saymak gerekir.

"Seç" temelde tersidir - Belirli bir ünvanı verilmiş ve belirtilen düğüme bir işaretçi (veya bu düğüm için anahtar) almak gerekir ediyoruz.

İki not: Birincisi, bu, değiştirmektedir hiç ağaç hiçbiri beri de (örneğin, AVL vs / kırmızı, siyah) kullanılır dengeleme ne şekilde hiçbir gerçek fark etmez; bu konuda hiç hiçbir dengeleme ile bir ağaç yanı eşdeğerdir. Bunu çok sık yapmak gerekir, ikinci olarak, birçok düğüm onun solunda ne kadar kayıt her düğüm için ekstra bir alan ekleyerek önemli ölçüde hızını artırabilir.

Cevap 28/02/2011 saat 04:07
kaynak kullanıcı

oy
1

Sıra Sol alt ağacın artı bir düğüm sayısı ve her düğüm için hesaplanır. Ben rütbe AVL ağaçları özgü bir kavram değildir inanıyoruz - herhangi bir ikili ağaç için hesaplanabilir.

Seç rütbesine tersidir. A sıra verilir ve rütbe bir düğüm eşleştirme dönmek zorunda.

Aşağıdaki kod sıralaması hesaplama gerçekleştirir:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
Cevap 30/08/2013 saat 10:13
kaynak kullanıcı

oy
0

Burada yazdığım ve AVL ağacı, belirli bir değerin bir sıralama elde etmek için iyi çalıştı kodudur. fark, parametre olarak bir düğüm kullanılan sadece bir i bir anahtar parametre kullanılmıştır. Kendi yol olarak değiştirebilirsiniz. Basit kod:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[NB] Sonra = 0 değişken rütbe başlatmak 0'dan rütbenizi başlatmak istiyorsanız. kesinlikle yöntem countNodes () bu kodu çalıştırmak için uygulamış olmaları gerekmektedir.

Cevap 08/09/2015 saat 20:14
kaynak kullanıcı

oy
-1

İşte yaptım budur. Benim programda bir elemanın sıralaması 1+ (bu öğenin daha büyük elemanların herhangi bir) olarak tanımlanır. Sen element ağacındaki sunmasına gerek yoktur burada not edebilirsiniz.

Algoritma rütbe bulmak için:

ağaç yapısında 1.In kökü içeren bir alt ağacındaki elementlerin hiçbir izlemek. Yani ağaç irade baş ağacında toplam öğeler içeriyor.

Bu düğüm daha küçük ise, o zaman temel toplam için element.Add daha büyük (sağ çocuk 1 + Kataloğundaki elemanları) elemanlar vardır ve özyinelemeli elemanını arama bir düğüm ile eleman 2.Compare sol çocuk.

eleman kök düğüm daha büyüktür 3.If sonra sadece sağ çocukta yinelemeli elemanı arayın. (şey eklemek gerek biz sol ağaç ihmal olduğundan, hangi tüm unsurları verilen anahtarla daha az)

Eğer öğesi boş ulaşıldığında bulduğunda algo 4.Terminate.

Verilen bir program belirli bir anahtar daha büyük elementlerin bir döner. 1+ döndürülen değer sıralamasıdır.

Kod pasajı:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

Bu yardımcı olur umarım :)

Cevap 03/10/2015 saat 16:52
kaynak kullanıcı

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