Znalezienie KTH najmniejszą wartość w BST

głosy
0

Oto co mam znaleźć KTH najmniejszą wartość w trakcie przeszukiwania binarnego drzewa:

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 oczywiście nie jest poprawna. Bez podania roztworu, może ktoś poprowadzi mnie w odpowiednim kierunku, w jaki sposób mogę rozwiązać ten problem? Mam problemy zastanawianie się, jak mogę znaleźć KTH najmniejszy element w BST.

Utwórz 03/05/2011 o 02:17
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

To powinno działać:

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

jak zadzwonić rank(root,k,0)

Odpowiedział 03/05/2011 o 02:35
źródło użytkownik

głosy
1

Jeśli masz rozmiary każdego z poddrzew, może to być wykonalne bez konieczności odczytywania danych do tablicy (lub inaczej przejeżdżające drzewo) i liczenie. Jeśli nie przechowywać informacje o rozmiarze poręczne, musisz funkcję pomocniczą do obliczania wielkości.

Podstawową ideą, dowiedzieć się, co jest wskaźnikiem bieżącego węzła. Jeżeli jest ona mniejsza niż k, trzeba szukać lewego poddrzewa. Jeżeli jest ona większa niż k, szukaj sobie prawo kompensowania węzły liczony od lewej strony i prądu. Zauważ, że to jest w zasadzie taki sam jak przeszukując regularnie BST, z wyjątkiem tej chwili szukamy przez indeks, a nie danych. Niektóre Pseudokod:

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

Aby zilustrować, rozważ to drzewo z oznaczonych indeksami (nawet nie martwić się o dane, gdyż nie jest ważne w wyszukiwaniu):

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

Załóżmy, że chcemy znaleźć 2nd (k = 2).
Począwszy od 3, wielkość lewego poddrzewa wynosi 3.
Jest większy niż k więc przejść do lewego poddrzewa.
Wielkość lewym poddrzewie jest 2.
k jest również 2 tak bieżący węzeł musi być 2nd.

Załóżmy, że chcemy znaleźć się 4 (k = 4).
Zaczynając od 3, wielkość lewej poddrzewem wynosi 3.
Jest to mniej niż l, aby ustawić nową k wynosi 0 (k”= 4 - (3 + 1)) i przenieść do odpowiedniej poddrzewem.
Począwszy od 6, wielkość lewego poddrzewa to 2.
Jest większy niż k”(0) więc przejść do lewego poddrzewa.
Wielkość lewym poddrzewie jest 0.
k”jest 0 więc bieżący węzeł musi być 4..

Masz pomysł.

Odpowiedział 03/05/2011 o 02:45
źródło użytkownik

głosy
5

BST jest posortowana drzewo binarne, przejścia na zamówienie (lewy poddrzewo, bieżący węzeł prawym poddrzewo) da posortowane wartości węzłów. Aby znaleźć KTH najmniejszą węzła, po prostu zrób to przechodzenie na zamówienie z licznikiem. Licznik rozpoczyna od 0, kiedy węzeł wykonuje ruch, wzrost o jeden, gdy osiągnie K, k-węzła jest najmniejsza.

Odpowiedział 03/05/2011 o 02:47
źródło użytkownik

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