Nalezení tý nejmenší hodnotu v BST

hlasů
0

Zde je to, co musím najít tý nejmenší hodnotu v binárním vyhledávacím stromu:

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

To samozřejmě není správný. Bez poskytnutí řešení, mohl někdo veď mě správným směrem, aby se, jak jsem mohl vyřešit? Mám potíže přijít na to, jak bych mohl najít tý nejmenší prvek v BST.

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


3 odpovědí

hlasů
0

To by mělo fungovat:

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

zavolat as rank(root,k,0)

Odpovězeno 03/05/2011 v 02:35
zdroj uživatelem

hlasů
1

Máte-li na velikosti každého z podstromů, může to být proveditelné, aniž by bylo nutné číst data do pole (nebo jinak projíždějící strom) a počítáním. Pokud nechcete uchovávat informace o velikosti po ruce, budete potřebovat pomocnou funkci pro výpočet velikosti.

Základní myšlenka, zjistit, co je index aktuálního uzlu. Je-li menší než k, je třeba hledat levý podstrom. Pokud je větší než k, vyhledávat právo započtení uzly počítáno zleva a proudem. Všimněte si, že toto je v podstatě stejný, jako je vyhledávání pomocí pravidelného BST, s výjimkou té době hledáme indexem, ne dat. Některé pseudocode:

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

Pro ilustraci, zvažte tento strom s vyznačenými indexy (ani starat o data, protože to není důležité při hledání):

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

Předpokládejme, že chceme najít 2nd (k = 2).
Od 3, velikost levého podstromu je 3.
je větší než k tak přesunout do levého podstromu.
Velikost levého podstromu je 2.
K je 2, takže je aktuální uzel musí být 2.

Předpokládejme, že chceme najít 4. (k = 4).
Od 3, velikost levého podstromu je 3.
To je méně než l, takže nastavit nový K být 0 (k‘= 4 - (3 + 1)), a přesun do pravého podstromu.
Od 6, velikost levého podstromu je 2.
Je větší, než k‘(0), takže pohyb do levého podstromu.
Velikost levého podstromu je 0.
K‘je 0, takže je aktuální uzel musí být 4..

Máte představu.

Odpovězeno 03/05/2011 v 02:45
zdroj uživatelem

hlasů
5

BST je tříděných binární strom, v-pořadí Průchod (vlevo podstromu aktuální uzel, vpravo podstromu) poskytne tříděných hodnoty uzlu. Chcete-li najít KTH nejmenší uzlu, prostě udělat traversal na objednávku s protiproudem. Čítač začíná od 0, vždy, když je překročen uzel, zvýší se o jednu, když dosáhne k, uzel je-té nejmenší.

Odpovězeno 03/05/2011 v 02:47
zdroj uživatelem

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