Găsirea KTH mai mică valoare într-un BST

voturi
0

Iată ce trebuie să găsească cea mai mică valoare KTH într-un arbore binar de căutare:

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

Acest lucru nu este în mod evident corect. Fara a oferi solutia, mi-ar putea ghida pe cineva în direcția corectă cu privire la modul în care am putea rezolva acest lucru? Sunt probleme cu imaginind cum am putut găsi KTH cel mai mic element într-un BST.

Întrebat 03/05/2011 la 02:17
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Acest lucru ar trebui să funcționeze:

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

suna ca rank(root,k,0)

Publicat 03/05/2011 la 02:35
sursa de către utilizator

voturi
1

Dacă aveți dimensiunile fiecăruia dintre subramificații, acest lucru poate fi greu de realizat fără a fi nevoie să citească datele într-o matrice (sau altfel traversează copac) și incrementală. Dacă nu păstrați informațiile de mărime la îndemână, veți avea nevoie de o funcție de ajutor pentru a calcula dimensiunea.

Ideea de bază, dau seama ce este indicele nodului curent. Dacă este mai mică decât k, aveți nevoie pentru a căuta în subarborele din stânga. În cazul în care este mai mare decât k, căutare dreptul de compensare nodurile numărate de la stânga și curent. Rețineți că acest lucru este în esență aceeași ca și căutarea prin intermediul unui BST regulat, cu excepția cazului de data aceasta suntem în căutarea de index, nu date. Unele pseudocod:

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

Pentru a ilustra, ia în considerare acest arbore cu indicii marcate (chiar nu vă faceți griji cu privire la datele deoarece nu este important în căutare):

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

Să presupunem că vrem să găsim de 2 (k = 2).
Începând de la 3, dimensiunea subarborelui din stânga este 3.
Acesta este mai mare decât k astfel încât trece la subarborele stâng.
Dimensiunea subarbore stâng este 2.
k este , de asemenea , 2 , astfel nodul curent trebuie să fie de 2.

Să presupunem că vrem să găsim de 4 (k = 4).
Începând de la 3, dimensiunea subarborelui din stânga este 3.
Este mai mică decât l ajustați astfel încât noul k să fie 0 (k“= 4 - (3 + 1)) și a trece la subarborelui drept.
Începând de la 6, dimensiunea subarborelui din stânga este 2.
Este mai mare decât k“(0) , astfel încât trece la subarborele stâng.
Dimensiunea subarbore stâng este 0.
k“este , de asemenea , 0 , astfel încât nodul curent trebuie să fie al 4 - lea.

Ai idee.

Publicat 03/05/2011 la 02:45
sursa de către utilizator

voturi
5

Un BST este un arbore binar sortat, un parcurgeri în ordine (subarbore stânga, nodul curent, subarbore dreapta) va da valori de nod triate. Pentru a găsi cel mai mic nod KTH, face doar un parcurgeri în ordine cu un contor. Contorul începe de la 0, ori de câte ori un nod este deplasată, ea crește cu unul, atunci când ajunge k, nodul este cel mai mic KTH unul.

Publicat 03/05/2011 la 02:47
sursa de către utilizator

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