Megtaláljuk a k-adik legkisebb értékét a BST

szavazat
0

Itt van, amit meg kell találni a k-adik legkisebb értékét bináris keresési fa:

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

Ez nyilvánvalóan nem helyes. Anélkül, hogy a megoldást, tudna valaki vezessen a helyes irányba, hogy hogyan lehetne megoldani ezt? Én gondjai kitalálni, hogyan lehetne megtalálni a k-adik legkisebb eleme a BST.

A kérdést 03/05/2011 02:17
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

Ennek működnie kell:

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

hívja a rank(root,k,0)

Válaszolt 03/05/2011 02:35
a forrás felhasználó

szavazat
1

Ha megvan a mérete az egyes részfák, ez lehet megvalósítható anélkül, hogy olvasni az adatokat egy tömbbe (vagy más áthaladó fa) és számolás fel. Ha nem tartja a méret információ kéznél, akkor szüksége lesz egy segítő funkciót méretének kiszámítására.

Az alapötlet, kitalálni, hogy mi van az index a jelenlegi csomópont. Ha ez kevesebb, mint k, meg kell keresni a bal részfa. Ha ez nagyobb, mint k, keresés a jobb ellensúlyozó csomópontok balról számítva és aktuális. Megjegyzendő, hogy ez lényegében ugyanaz, mint a kereső segítségével rendszeresen BST, kivéve, ezúttal keresünk az index, nem az adatok. Néhány pszeudokódját:

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

Annak illusztrálására, hogy ezt a fát a jelölt indexek (ne aggódj az adatok nem fontos a keresés):

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

Tegyük fel, hogy szeretné megtalálni a 2. (k = 2).
-tól 3, a méret a bal oldali részfa 3.
Ez nagyobb, mint k, így mozgatni a bal részfa.
A méret a bal részfa 2.
k is 2 így a jelenlegi csomópontot kell a 2..

Tegyük fel, hogy szeretné megtalálni a 4. (k = 4).
-tól 3, a méret a bal oldali részfa 3.
Ez kevesebb, mint l úgy állítsa be az új k értéke 0 (k”= 4 - (3 + 1)), és mozgassa a jobb részfa.
-tól 6, a méret a bal oldali részfa 2.
ez nagyobb, mint k”(0), így mozgatni a bal részfa.
A méret a bal részfa 0.
k”jelentése szintén 0 így a jelenlegi csomópontot kell a 4..

Az ötlet.

Válaszolt 03/05/2011 02:45
a forrás felhasználó

szavazat
5

A BST egy rendezett bináris fa, in-sorrendben bejárás (bal részfa, aktuális csomópont jobb részfa) ad kiválogatott csomóponti értékeket. Ahhoz, hogy megtalálja a k-adik legkisebb csomópont, csak nem egy in-order bejárás a számláló. A számláló 0-ról indul, amikor egy csomópont áthaladni, növelje azt egy, amikor eléri a K, a csomópont a k-adik legkisebb.

Válaszolt 03/05/2011 02:47
a forrás felhasználó

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