Trouver la plus petite valeur kième dans un BST

voix
0

Voici ce que je dois trouver la plus petite valeur dans un arbre kième de recherche binaire:

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

Ceci est évidemment pas correct. Sans fournir la solution, quelqu'un pourrait me guider dans la bonne direction à comment je pouvais résoudre ce problème? Je ne parviens pas à comprendre comment je pouvais trouver l'élément le plus petit kième dans un BST.

Créé 03/05/2011 à 02:17
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Cela devrait fonctionner:

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

appeler comme rank(root,k,0)

Créé 03/05/2011 à 02:35
source utilisateur

voix
1

Si vous avez la taille de chacun des sous-arbres, cela peut être faisable sans avoir à lire les données dans un tableau (ou autrement traversant l'arbre) et de comptage. Si vous ne gardez pas les informations de taille à portée de main, vous aurez besoin d'une fonction d'assistance pour calculer la taille.

L'idée de base, comprendre ce qui est l'indice du noeud courant. Si elle est inférieure à k, vous devez rechercher le sous-arbre gauche. Si elle est supérieure à k, rechercher le droit de compenser les nœuds comptés à partir de la gauche et du courant. Notez que ceci est essentiellement la même que la recherche par un BST régulière, sauf que cette fois nous sommes à la recherche par index, pas de données. Certains pseudo-code:

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

Pour illustrer ceci, cet arbre avec les indices marqués (ne vous inquiétez même pas les données comme il est pas important dans la recherche):

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

Supposons que nous voulons trouver le 2ème (k = 2).
À partir de 3, la taille du sous - arbre gauche est 3.
Il est supérieur à k donc passer à la sous - arbre gauche.
La taille du sous - arbre gauche est 2.
k est 2 de sorte que le nœud actuel doit être le 2ème.

Supposons que nous voulons trouver le 4ème (k = 4).
A partir de trois, la taille du sous - arbre gauche est égal à 3.
Il est donc inférieur à l ajuster le nouveau k soit 0 (k »= 4 - (3 + 1)) et passer à la sous - arbre droit.
À partir de 6, la taille du sous - arbre gauche est 2.
Il est supérieur à k »(0) donc passer à la sous - arbre gauche.
La taille du sous - arbre gauche est 0.
k » est 0 si le nœud actuel doit être le 4ème.

Vous avez eu l'idée.

Créé 03/05/2011 à 02:45
source utilisateur

voix
5

A BST est un arbre binaire triée, un ordre dans la traversée (sous-arbre gauche, le noeud courant, sous-arbre droit) donnera les valeurs de nœud triées. Pour trouver le noeud le plus petit kième, il suffit de faire un dans l'ordre traversal avec un compteur. Le compteur commence à partir de 0, chaque fois qu'un noeud est traversé, l'augmenter par un, quand il atteint k, le noeud est le k-ième plus petite.

Créé 03/05/2011 à 02:47
source utilisateur

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