Jak najít hodnost uzlu v AVL stromu?

hlasů
4

Musím provádět dvě hodnotit dotazy [ rank(k)a select(r)]. Ale dříve, než začnu o tom, musím přijít na to, jak tyto dvě funkce pracovat.

Pokud je mi známo, rank(k)vrátí hodnost daného klíče k, a select(r)vrací klíč dané hodnosti r.

Takže moje otázky jsou:

1.) Jak si vypočítat hodnost uzlu v AVL (self vyrovnávání BST)?

2) Je možné, aby více než jeden klíč, aby měli stejnou hodnost? A pokud ano, co woulud select(r)vrátit?

Jdu zahrnovat vzorek AVL strom, který se můžete obrátit na zda to pomůže odpovědět na otázku.

zadejte

Dík!

Položena 28/02/2011 v 03:40
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
3

Vaše otázka opravdu scvrkává na: „Jak se pojem‚hodnost‘obvykle definována vzhledem k AVL stromu?“ (A možná, jak je ‚vybrat‘ obvykle definovány stejně).

Alespoň tak jsem viděl termín je používán, „rank“ se rozumí místo mezi uzly ve stromě - tedy, kolik uzlů mají po jeho levé straně. Jste obvykle daný ukazatel na uzel (nebo možná klíčovou hodnotou) a je třeba počítat počet uzlů na její levé straně.

„Volba“ je v podstatě opak - že jste při určitém pořadí, a je třeba získat ukazatel na určeném uzlu (nebo tlačítka pro tento uzel).

Dvě poznámky: Za prvé, protože ani jeden z těchto modifikuje stromů vůbec nezáleží na skutečnou změnu, jakou formu vyrovnávání se používá (např AVL vs. červená / černá); když na to přijde strom bez vyrovnávání vůbec odpovídá stejně. Za druhé, pokud potřebujete to častěji, můžete zvýšit rychlost značně tím, že přidá další pole pro každý uzel záznam kolik uzly jsou na její levé straně.

Odpovězeno 28/02/2011 v 04:07
zdroj uživatelem

hlasů
1

Rank je počet uzlů v levém podstromu, plus jedna, a je vypočtena pro každý uzel. Věřím, že pořadí není pojem specifický pro AVL stromy - to lze vypočítat pro každou binárního stromu.

Select se nachází přímo naproti zařadit. Hodnost je dána a vy se musíte vrátit ve stejném uzlu, který hodnost.

Následující kód bude provádět výpočet rank:

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));
        }
}
Odpovězeno 30/08/2013 v 10:13
zdroj uživatelem

hlasů
0

Zde je kód jsem napsal a fungovalo to dobře pro AVL strom získat hodnost určitou hodnotu. Rozdíl je jen jste použili uzel jako parametr a použil jsem klíč parametru. můžete upravit to jak svým vlastním způsobem. Ukázkový kód:

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

[Pozn] Chcete-li začít svůj hodnost od 0 inicializovat proměnnou hodnost = 0. určitě by se provedly metoda countNodes () pro spuštění tohoto kódu.

Odpovězeno 08/09/2015 v 20:14
zdroj uživatelem

hlasů
-1

Zde je to, co jsem udělal. V mém programu hodnost prvku je definována jako 1+ (počet prvků větší než tento prvek). Můžete na vědomí, zde že element nemusí předkládat ve stromu.

Algoritmus najít hodnost:

1.In stromové struktuře sledovat no prvků v podstromu, včetně kořene. Takže hlava strom bude obsahuje celkem prvky stromu.

2.Compare prvek s uzlem, pokud je menší než uzlu, pak tam jsou (1 + No.of prvky v pravé dítě) prvky větší než klíč ji element.Add na celkový a rekurzivně vyhledávání prvku v left dítě.

3. Pokud prvek je větší než kořenový uzel pak stačí vyhledat prvek rekurzivně v pravém dítěte. (Není třeba nic dodávat, protože jsme zanedbávají levý strom, v níž jsou všechny prvky jsou menší než daný klíč)

4.Terminate na algo když zjistíte prvek dosažení null.

Daný program se vrací počet prvků větší než daný klíč. 1+ vrácená hodnota je pozice.

fragment kódu:

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

Snad to pomůže :)

Odpovězeno 03/10/2015 v 16:52
zdroj uživatelem

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