¿Cómo encontrar el rango de un nodo en un árbol AVL?

votos
4

Necesito implementar dos consultas de rango [ rank(k)y select(r)]. Pero antes de que pueda empezar en esto, tengo que averiguar cómo funcionan las dos funciones.

Por lo que yo sé, rank(k)devuelve el rango de una clave dada k, y select(r)devuelve la clave de un rango dado r.

Así que mis preguntas son:

1.) ¿Cómo se calcula el rango de un nodo en un BST AVL (auto equilibrio)?

2.) ¿Es posible que más de una clave para tener el mismo valor? Y si es así, ¿qué woulud select(r)volver?

Voy a incluir un árbol AVL muestra de lo que puede hacer referencia a si ayuda a responder a la pregunta.

introducir

¡Gracias!

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


4 respuestas

votos
3

Su pregunta realmente se reduce a: "¿cómo está el término 'ranking' normalmente define con respecto a un árbol AVL?" (Y, posiblemente, cómo es 'seleccionar' normalmente definido también).

Al menos como he visto el término utilizado, "rango" se refiere a la posición entre los nodos en el árbol - es decir, el número de nodos están a su izquierda. Por lo general, dan un puntero a un nodo (o tal vez un valor de clave) y hay que contar el número de nodos a su izquierda.

"Select" es básicamente lo contrario - que le den un rango concreto, y la necesidad de recuperar un puntero al nodo especificado (o la tecla para ese nodo).

Dos notas: En primer lugar, ya que ninguno de ellos modifica el árbol en todo, no hay diferencia real lo que forma de equilibrio se utiliza (por ejemplo, AVL vs rojo / negro); para el caso de un árbol sin equilibrio en absoluto equivale también. En segundo lugar, si usted tiene que hacer esto con frecuencia, puede mejorar la velocidad considerablemente mediante la adición de un campo adicional a registrando la cantidad de nodos están a su izquierda cada nodo.

Respondida el 28/02/2011 a las 04:07
fuente por usuario

votos
1

Rango es el número de nodos en el árbol secundario hacia la izquierda más uno, y se calcula para cada nodo. Creo rango no es un concepto específico de árboles AVL - se puede calcular para cualquier árbol binario.

Seleccionar está justo enfrente de clasificar. Un rango está determinado y hay que devolver un juego nodo de ese rango.

El siguiente código realizar el cálculo rango:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
Respondida el 30/08/2013 a las 10:13
fuente por usuario

votos
0

Aquí está el código que he escrito y trabajado bien para AVL árbol para obtener el rango de un valor particular. la diferencia es sólo que utiliza un nodo como parámetro y que utiliza una clave de un parámetro. puede modificar esto como su propio camino. Código de muestra:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[Nota] Si desea iniciar su rango de 0 a continuación, inicializar rango variable = 0. que sin duda debe haber implementado las countNodes () para ejecutar el código.

Respondida el 08/09/2015 a las 20:14
fuente por usuario

votos
-1

Esto es lo que he hecho. En mi programa de la categoría de un elemento se define como el 1+ (sin los elementos mayores que ese elemento). Se puede observar aquí que el elemento no necesita presentar en el árbol.

Algoritmo para encontrar rango:

1.In la estructura de árbol no perder de vista el no de los elementos en un árbol secundario que incluye la raíz. Por lo que el jefe de la voluntad del árbol contiene elementos totales en el árbol.

2.Compare el elemento con un nodo, si es más pequeño que el nodo, entonces hay (1 + N º de elementos en hijo derecho) Elementos mayores que la clave element.Add al total y la búsqueda de forma recursiva el elemento en el hijo izquierdo.

3. Si el elemento es mayor que el nodo raíz a continuación, sólo buscar el elemento de forma recursiva en el hijo derecho. (Sin necesidad de añadir nada ya que estamos descuidando el árbol de la izquierda, en la que todos los elementos están a menos de la clave dada)

4.Terminate el algo cuando encuentre el elemento se alcanzan nula.

El programa dado no devuelve nada de elementos mayores que la clave dada. 1+ el valor devuelto es el rango.

fragmento de código:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

Espero que esto ayude :)

Respondida el 03/10/2015 a las 13:52
fuente por usuario

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