Encontrar el valor k-ésimo más pequeño en un BST

votos
0

Esto es lo que tengo que encontrar el valor k-ésimo más pequeño en un árbol binario de búsqueda:

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

Esto obviamente no es correcta. Sin proporcionar la solución, es posible que alguien me guíe en la dirección correcta en cuanto a cómo podría solucionar esto? Estoy teniendo problemas para averiguar cómo podía encontrar el k-ésimo elemento más pequeño en un BST.

Publicado el 03/05/2011 a las 02:17
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

Esto debería funcionar:

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

llame como se rank(root,k,0)

Respondida el 03/05/2011 a las 02:35
fuente por usuario

votos
1

Si usted tiene los tamaños de cada una de las sub-estructuras, esto puede ser factible sin tener que leer los datos en una matriz (o de lo contrario recorrer el árbol) y contando. Si usted no mantiene la información de tamaño manejable, tendrá una función de ayuda para calcular el tamaño.

La idea básica, averiguar cuál es el índice del nodo actual. Si es menor que k, es necesario buscar el subárbol izquierdo. Si es mayor que k, buscar el derecho de compensar los nodos contados desde la izquierda y actual. Tenga en cuenta que esto es esencialmente lo mismo que buscar a través de una BST regular, excepto que esta vez estamos buscando por el índice, no datos. Algunos pseudocódigo:

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

Como ejemplo, consideremos este árbol con los índices marcados (ni siquiera preocuparse de los datos ya que no es importante en la búsqueda):

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

Supongamos que queremos encontrar el segundo (k = 2).
A partir de 3, el tamaño del subárbol izquierdo es 3.
Es mayor que k así pasar a la subárbol izquierdo.
El tamaño del subárbol izquierdo es 2.
k es también 2 por lo que el nodo actual debe ser el segundo.

Supongamos que queremos encontrar el cuarto (k = 4).
A partir de 3, el tamaño del subárbol izquierdo es 3.
Es menos de l así ajustar el nuevo k ser 0 (k'= 4 - (3 + 1)) y pasar a la subárbol derecho.
A partir de 6, el tamaño del subárbol izquierdo es 2.
Es mayor que k'(0) para moverse a la subárbol izquierdo.
El tamaño del subárbol izquierdo es 0.
k' también es 0 por lo que el nodo actual debe ser la cuarta.

Se entiende la idea.

Respondida el 03/05/2011 a las 02:45
fuente por usuario

votos
5

Un BST es un árbol binario ordenado, un recorrido en orden (subárbol izquierdo, nodo actual, subárbol derecho) dará valores de nodos ordenados. Para encontrar el k-ésimo nodo más pequeño, acaba de hacer un recorrido en orden con un contador. El contador se inicia desde 0, cada vez que se atraviesa un nodo, la aumenta por uno, cuando alcanza k, el nodo es el k-ésimo más pequeño.

Respondida el 03/05/2011 a las 02:47
fuente por usuario

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