Finne KTH minste verdien i en BST

stemmer
0

Her er hva jeg har å finne den k-te minste verdien i et binært søketre:

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

Dette er selvsagt ikke riktig. Uten å gi løsningen, kan noen guide meg i riktig retning med hensyn til hvordan jeg kan løse dette? Jeg har problemer med å finne ut hvordan jeg kunne finne den k-te minste elementet i en BST.

Publisert på 03/05/2011 klokken 01:17
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Dette bør fungere:

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

kaller som rank(root,k,0)

Svarte 03/05/2011 kl. 01:35
kilden bruker

stemmer
1

Hvis man har størrelser av hver av undertrærne, kan dette være mulig uten å måtte lese data inn i en matrise (eller på annen måte å traversere treet) og å telle opp. Hvis du ikke holde størrelsen informasjon hendig, trenger du en hjelper funksjon for å beregne størrelsen.

Den grunnleggende ideen, finne ut hva som er indeksen for den aktuelle noden. Hvis det er mindre enn k, må du søke den venstre undertreet. Hvis den er større enn k, søke i rett utligne nodene regnet fra venstre og strøm. Merk at dette er egentlig det samme som å søke gjennom en vanlig BST, bortsett fra denne tiden vi søker etter indeks, ikke data. Noen pseudokode:

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

For å illustrere, vurdere dette treet med de merkede indekser (ikke engang bekymre deg om dataene som det er ikke viktig i søke):

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

Anta at vi ønsker å finne den andre (k = 2).
Fra 3, størrelsen på den venstre undertreet er 3.
Det er større enn k, så bevege seg mot venstre treet.
Størrelsen på den venstre undertreet er 2.
k er også 2 slik at strømnode må være den andre.

Anta at vi ønsker å finne den fjerde (k = 4).
Fra 3, størrelsen på den venstre undertreet er 3.
Det er mindre enn l, slik justere ny k til å være 0 (k'= 4 - (3 + 1)) og bevege seg mot høyre undertreet.
Starter 6, størrelsen på den venstre undertreet er 2.
Det er større enn k'(0) så bevege seg mot venstre treet.
Størrelsen på den venstre undertreet er 0.
k' er også 0, slik at strømnode må være den fjerde.

Du får ideen.

Svarte 03/05/2011 kl. 01:45
kilden bruker

stemmer
5

En BST er en sortert binært tre, en i-rekkefølge traversering (venstre treet, strømnode, høyre subtre) vil gi sorterte nodeverdier. For å finne den k-te minste node, bare gjøre en in-order traversering med en teller. Telleren begynner fra 0, når en node er gjennomløpt, øke den ved en, når den når k er node den k-te minste ett.

Svarte 03/05/2011 kl. 01:47
kilden bruker

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