You are on page 1of 10

Notice something different? We've made a few improvements to Wikipedia. Learn more!

rbol binario de bsqueda


De Wikipedia, la enciclopedia libre
Saltar a navegacin , bsqueda

Un rbol de bsqueda binaria de tamao 9 y la profundidad de 3, con raz y hojas de 8 1, 4, 7 y 13 En ciencias de la computacin , un rbol binario de bsqueda (BST) o solicitarse en rbol binario es un nodo basado en rbol binario estructura de datos que tiene las siguientes propiedades: [1]

La izquierda subrbol de un nodo contiene slo los nodos con claves de menos de nodo tecla. El subrbol derecho de un nodo contiene slo los nodos con claves de mayor o igual a la clave del nodo. Tanto el subrboles izquierdo y derecho tambin debe ser rboles binarios de bsqueda.

De las propiedades anteriores la consecuencia natural es que:

Cada nodo (elemento del rbol) tiene una clave distinta.

En general, la informacin representada por cada nodo es un registro en lugar de un nico elemento de datos. Sin embargo, para la secuenciacin de los propsitos, los nodos son comparados de acuerdo a sus teclas en lugar de cualquier parte de sus registros asociados. La principal ventaja de los rboles de bsqueda binaria sobre otras estructuras de datos es que los relacionados con algoritmos de clasificacin y algoritmos de bsqueda como el recorrido en orden puede ser muy eficiente. rboles binarios de bsqueda son fundamentales una estructura de datos utilizada para construir estructuras de datos ms abstractos, tales como conjuntos , conjuntos mltiples , y arrays asociativos .

Contenido
[hide]

1 Operaciones o 1,1 bsqueda o 1.2 Insercin o 1.3 Supresin o 1.4 Traversal o Ordenar 1,5 2 Tipos o 2.1 Comportamiento comparaciones o 2,2 rboles de bsqueda binaria ptima 3 Vase tambin 4 Referencias 5 Vase tambin 6 Enlaces externos

[ editar ] Operaciones
Las operaciones en un rbol binario requieren comparaciones entre los nodos. Estas comparaciones se hacen con llamadas a un comparador , que es una subrutina que calcula el total del pedido (orden lineal) en cualquiera de los dos valores. Esta comparacin puede ser explcita o implcitamente definido, segn el idioma en que se aplica el BST.

[ editar ] Bsqueda
Buscando un rbol binario de un valor especfico puede ser un recursivo o iterativo proceso. Esta explicacin abarca un mtodo iterativo. Comenzamos examinando el nodo raz . Si el rbol es nulo, el valor que est buscando no existe en el rbol. De lo contrario, si el valor es igual a la raz, la bsqueda tiene xito. Si el valor es inferior a la raz, busque en el subrbol izquierdo. Del mismo modo, si sta es superior a la raz, busque en el subrbol derecho. Este proceso se repite hasta que el valor se encuentra o el subrbol indicado es nulo. Si el valor buscado no se encuentra ante un subrbol nula es alcanzado, entonces el tema no debe estar presente en el rbol. Aqu est el algoritmo de bsqueda en el lenguaje de programacin Python :
# 'Nodo' se refiere a la relacin padre-nodo en este caso def search_binary_tree (nodo, clave): si el nodo es None: Ninguno de retorno que no se encuentra la tecla # si el nodo <clave. clave: search_binary_tree retorno (node. leftChild, clave) elif nodo> clave. clave: search_binary_tree retorno (node. rightChild, clave)

else: # clave es igual al nodo clave nodo de retorno. valor # encontrados clave

... O equivalente Haskell :


searchBinaryTree NullNode _ = Nothing searchBinaryTree clave (nodeKey nodeValue Nodo (leftChild, rightChild)) = caso comparar nodeKey clave de LT - searchBinaryTree> Tecla leftChild GT - searchBinaryTree> Tecla rightChild EQ -> Solamente nodeValue

Esta operacin requiere O (log n) en el caso promedio, pero necesita O (n) el tiempo en el peor de los casos, cuando el rbol se parece a un desequilibrio lista enlazada ( rbol degenerado ). Suponiendo que BinarySearchTree es una clase con una funcin miembro "de bsqueda (int)" y un puntero al nodo raz, el algoritmo tambin es fcil de implementar en trminos de un enfoque iterativo. El algoritmo entra en un bucle, y decide si la rama izquierda o derecha segn el valor del nodo en cada nodo primario.
bool BinarySearchTree:: buscar (int val) ( Nodo * siguiente = esto - root> (); while (siguiente! = 0) ( if (val == siguiente - valor> ()) ( return true; ) else if (val <Los - valor> ()) ( next = siguiente - a la izquierda> (); ) else if (val siguiente> - valor> ()) ( next = siguiente -> derecha (); ) ) / / No encontrado return false; )

Aqu est el algoritmo de bsqueda en el lenguaje de programacin Java :


bsqueda booleana pblica (nodo TreeNode, los datos int) ( if (nodo == null) ( return false; ) if (node. getData () == data) ( return true; ) Else if (datos <nodo. GetData ()) ( / / Datos deben estar en subrbol izquierdo bsqueda de retorno (node. getLeft (), datos); Else ()

/ / Datos deben estar en subrbol derecho bsqueda de retorno (node. GetRight (), datos); ) )

[ editar ] Insercin
La insercin comienza como una bsqueda comenzara, si la raz no es igual al valor, buscamos la izquierda o derecha subrboles como antes. Con el tiempo, llegaremos a un nodo externo y agregue el valor como su hijo derecho o izquierdo, dependiendo del valor del nodo. En otras palabras, se examinan la raz y de forma recursiva insertar el nuevo nodo al subrbol izquierdo si el nuevo valor es inferior a la raz, o el subrbol de la derecha si el nuevo valor es mayor o igual a la raz. As es como una tpica bsqueda de la insercin rbol binario puede ser realizado en C ++:
/ * Inserta el nodo apuntado por "nodo_nuevo" en el subrbol con raz en "TreeNode" * / insertarNodo vaco (* Nodo y TreeNode Nodo * nodo_nuevo) ( if (TreeNode == NULL) TreeNode = nodo_nuevo; else if (nodo_nuevo - clave TreeNode <> -> Clave) InsertarNodo (TreeNode - izquierda>, nodo_nuevo); ms InsertarNodo (TreeNode -> derecha, nodo_nuevo); )

Lo anterior "destructiva" variante de procedimiento modifica el rbol en su lugar. Utiliza solamente el espacio constante, pero la versin anterior del rbol se pierde. Por otra parte, como en el siguiente Python ejemplo, podemos reconstruir todos los ancestros del nodo insertado, cualquier referencia a la raz del rbol original sigue siendo vlida, haciendo que el rbol de una estructura de datos persistente :
def binary_tree_insert (nodo, clave, valor): si el nodo es None: volver TreeNode (Ninguno, clave, valor, ninguno) si la clave == nodo. clave: TreeNode retorno (node. izquierda, la tecla, el valor, el nodo. Derecha) si el nodo <clave. clave: volver TreeNode (binary_tree_insert (node. izquierda, clave, valor), el nodo. clave, nodo. valor, nodo. derecha) otra cosa: TreeNode retorno (node. izquierda, nodo. Clave, nodo. Valor, binary_tree_insert (node. derecho, clave, valor))

La parte que se vuelve a generar usos (log n) de espacio en el caso promedio y (n) en el peor de los casos (vase la notacin-O ). En cualquier versin, esta operacin requiere un tiempo proporcional a la altura del rbol en el peor de los casos, que es O (log n) en el caso promedio de todos los rboles, pero (n ) tiempo en el peor de los casos.

Otra manera de explicar la insercin es que para insertar un nuevo nodo en el rbol, su valor se compara primero con el valor de la raz. Si su valor es inferior a la raz, que se compara con el valor del hijo izquierdo de la raz. Si su valor es mayor, se la compara con el hijo derecho de la raz. Este proceso contina hasta que el nuevo nodo se compara con un nodo hoja, y luego se aade como derecho de este nodo o un nio a la izquierda, dependiendo de su valor. Hay otras maneras de insertar nodos en un rbol binario, pero esta es la nica manera de insertar nodos en las hojas y, al mismo tiempo preservar la estructura de BST. Aqu hay un enfoque iterativo para la insercin en un rbol de bsqueda binaria en el Lenguaje de Programacin Java :
public void insertar (datos int) ( if (raiz == null) ( root = TreeNode nueva (datos, null, null); Else () TreeNode actual root =; while (actual! = null) ( if (datos <actual. getData ()) ( / / Inserto la izquierda if (current. getLeft () == null) ( actual. setLeft (nuevo TreeNode (datos, null, null)); de retorno; Else () actual = actual. getLeft (); ) Else () / / Inserto la derecha if (current. GetRight () == null) ( actual. setRight (nuevo TreeNode (datos, null, null)); de retorno; Else () actual = actual. GetRight (); ) ) ) ) )

A continuacin se muestra un enfoque recursivo al mtodo de insercin. Como los punteros no estn disponibles en Java tenemos que devolver un puntero nuevo nodo a la persona que llama como se indica por la lnea final en el mtodo.
pblica insertar TreeNode (nodo TreeNode, los datos int) ( if (nodo == null) ( = nodo TreeNode nueva (datos, null, null); Else () if (datos <nodo. getData ()) ( / / Inserto la izquierda nodo. izquierda = insercin (node. getLeft (), datos); Else () / / Inserto la derecha

nodo. derecha = insercin (node. GetRight (), datos); ) ) volver nodo; )

[ editar ] Supresin
Hay tres posibles casos a considerar:

Eliminacin de una hoja (nodo sin hijos): Cmo eliminar una hoja es fcil, ya que simplemente puede eliminarlo del rbol. Eliminar un nodo con un hijo: Eliminarlo y sustituirlo por su hijo. Eliminar un nodo con dos hijos: Llame al nodo que se borr "N". No elimine N. En su lugar, elegir entre su nodo en el sucesor de orden o su nodo antecesor en orden, "R". Vuelva a colocar el valor de N con el valor de R, a continuacin, elimine R. (Nota: R se tiene hasta un nio.)

Al igual que con todos los rboles binarios, en orden sucesor un nodo es el hijo ms a la izquierda de su subrbol derecho, y en orden un predecesor del nodo es el hijo ms a la derecha de su subrbol izquierdo. En cualquier caso, este nodo tiene cero o un nio. Eliminar de acuerdo con uno de los dos casos ms sencillos anteriores.

El uso constante de la orden o el sucesor en orden antecesor en cada instancia del caso de dos nios-puede conducir a un desequilibrio de rboles, por lo que aadimos una buena implementaciones inconsistencia de esta seleccin. Tiempo de anlisis: Aunque esta operacin no siempre recorrer el rbol hasta una hoja, esto es siempre una posibilidad, por lo que en el peor de los casos se requiere un tiempo proporcional a la altura del rbol. No requiere ms an cuando el nodo tiene dos hijos, dado que todava sigue un camino nico y no visita ningn nodo dos veces. Este es el cdigo en Python:
def findMin (self): ''' Busca el elemento ms pequeo que es un hijo de la libre * * ''' current_node = auto mientras current_node. left_child: current_node = current_node. left_child

volver current_node def replace_node_in_parent (self, = Ninguno new_value): ''' Elimina la referencia a * * * * yo de self.parent y lo reemplaza con * new_value *. ''' si trabaja por cuenta propia ==. padres. left_child: uno mismo. padres. left_child = new_value otra cosa: uno mismo. padres. right_child = new_value si new_value: new_value. padres = yo. padres def binary_tree_delete (self, clave): si <clave auto. clave: uno mismo. left_child. binary_tree_delete (clave) elif clave auto>. clave: uno mismo. right_child. binary_tree_delete (clave) else: # eliminar la clave aqu si uno mismo. left_child y yo. right_child: # si ambos la presencia de nios # Obtiene el ms pequeo nodo que es ms grande que uno mismo * * sucesor = yo. right_child. findMin () key = sucesor. auto. clave # * * Si el sucesor tiene un hijo, que se sustituya por # En este momento, slo puede tener un right_child * * # Si no tiene hijos, * * right_child ser "Ninguno" sucesor. replace_node_in_parent (successor. right_child) elif auto. left_child o por cuenta propia. right_child: # si el nodo tiene un solo hijo si uno mismo. left_child: uno mismo. replace_node_in_parent (auto. left_child) otra cosa: uno mismo. replace_node_in_parent (auto. right_child) else: # este nodo no tiene hijos uno mismo. replace_node_in_parent (Ninguno)

[ editar ] Recorrido
Artculo principal: recorrido de rbol Una vez que el rbol de bsqueda binaria se ha creado, sus elementos pueden ser recuperados en orden de forma recursiva que atraviesa el subrbol izquierdo del nodo raz, el acceso a la misma nodo, a continuacin, recorrer recursivamente el subrbol derecho del nodo, continuando este patrn con cada nodo El rbol ya que es visitada de forma recursiva. Al igual que con todos los rboles binarios, se puede realizar un recorrido pre-orden o una orden de recorrido de post , pero tampoco son susceptibles de ser utilizadas para los rboles binarios de bsqueda. El cdigo en el orden de recorrido en Python es la siguiente. Se ha previsto de devolucin de llamada para cada nodo en el rbol.
def traverse_binary_tree (nodo, de devolucin de llamada): si el nodo es None: volver traverse_binary_tree (node. leftChild, devolucin de llamada)

de devolucin de llamada (node. valor) traverse_binary_tree (node. rightChild, devolucin de llamada)

Traversal requiere (n) el tiempo, ya que debe visitar cada nodo. Este algoritmo es O (n), por lo que es asintticamente ptima .

[ editar ] Ordenar
Un rbol de bsqueda binaria se puede utilizar para poner en prctica un sencillo pero eficiente algoritmo de ordenacin . Al igual que heapsort , insertamos todos los valores que desea ordenar en nuevos orden la estructura de datos, en este caso un rbol de bsqueda binaria, y luego recorrer en ella el orden, la construccin de nuestro resultado:
def build_binary_tree (valores): rbol = Ninguno para v en valores: = rbol binary_tree_insert (rbol, v) retorno de rboles get_inorder_traversal def (root): ''' Devuelve una lista que contiene todos los valores en el rbol, comenzando en la raz * *. Recorre el rbol en orden (leftChild, raz, rightChild). ''' resultado = [] traverse_binary_tree (raz, elemento lambda: resultado. append (elemento)) return resultado

El caso peor tiempo de build_binary_tree es (n le das una lista ordenada de valores, se los encadena en una lista enlazada sin subrboles izquierdo. Por ejemplo, traverse_binary_tree([1, 2, 3, 4, 5]) se obtiene el rbol (1 (2 (3 (4 (5))))) . Hay varios planes para superar esta falencia con simples rboles binarios, el ms comn es el de equilibrio de rbol binario de bsqueda auto . Si este mismo procedimiento se realiza mediante un rbol, el peor de los casos el tiempo total es O (n log n), que es asintticamente ptima para un tipo de comparacin . En la prctica, los pobres cach de rendimiento y agreg sobrecarga en el tiempo y espacio para una base tipo de rboles (en particular para el nodo de asignacin ) que sea asintticamente ptima a otros tipos inferiores, tales como heapsort para ordenar la lista esttica. Por otra parte, es uno de los mtodos ms eficientes de seleccin adicionales, agregar elementos a una lista con el tiempo, manteniendo la lista ordenada en todo momento.

2)-Si

[ editar ] Tipos
Hay muchos tipos de rboles binarios de bsqueda. AVL rboles y los rboles rojonegro son las formas de auto-equilibrio de los rboles binarios de bsqueda . Un rbol de angulacin es un rbol de bsqueda binaria que se mueve automticamente visitada con frecuencia los elementos ms cerca de la raz. En un treap ("rbol montn "), cada

nodo tambin tiene una prioridad y el nodo primario tiene mayor prioridad que a sus hijos. Otros dos ttulos que describen los rboles de bsqueda binaria es que de un rbol completo y degenerada. Un rbol completo es un rbol con n niveles, donde para cada nivel d <= n - 1, el nmero de nodos existentes a nivel d es igual a 2 d. Esto significa que todos los nodos posibles existen en estos niveles. Un requisito adicional para que un rbol binario completo es que para n nivel, mientras que cada nodo no tiene que existir, los nodos que existan deben llenar de izquierda a derecha. Un rbol degenerado es un rbol donde cada nodo primario, slo hay un nodo secundario asociado. Lo que esto significa es que en una medicin del rendimiento, el rbol esencialmente se comportar como una lista enlazada estructura de datos.

[ editar ] comparaciones de rendimiento


DA Heger (2004) [2] presenta una comparacin de rendimiento de los rboles binarios de bsqueda. Treap se encontr que la media de mejor rendimiento, mientras que -negro rbol rojo se encontr que la cantidad ms pequea de las fluctuaciones de rendimiento.

[ editar ] rboles binarios de bsqueda ptima


Si no va a modificar un rbol de bsqueda, y sabemos exactamente con qu frecuencia cada artculo ser accesible, podemos construir un rbol binario de bsqueda ptimo, que es un rbol de bsqueda donde el coste medio de buscar un artculo (el esperado coste de bsqueda) se reduce al mnimo. Incluso si slo tenemos estimaciones de los costos de bsqueda, este sistema puede acelerar considerablemente las bsquedas en promedio. Por ejemplo, si usted tiene una BST de las palabras utilizadas en Ingls un corrector ortogrfico , que podra equilibrar el rbol basado en la frecuencia de palabras en el corpus de texto , colocando palabras como "el" cerca de la raz y palabras como "agerasia" cerca de las hojas. Este rbol puede ser comparado con los rboles Huffman , que igualmente pretenden poner Artculos de uso frecuente cerca de la raz a fin de producir una densa informacin de codificacin, sin embargo, los rboles Huffman elementos de datos nica tienda en hojas, y esos elementos no tiene que ser ordenado. Si no sabemos la secuencia en que los elementos en el rbol se tendr acceso con antelacin, podemos utilizar rboles splay que son asintticamente tan bueno como cualquier rbol de bsqueda esttica podemos construir para cualquier secuencia particular de operaciones de bsqueda. alfabtico rboles son rboles Huffman con la restriccin adicional sobre el orden, o, equivalentemente, rboles de bsqueda con la modificacin que todos los elementos se almacenan en las hojas. algoritmos ms rpidos existentes para una ptima rboles binarios alfabticos (OABTs). Ejemplo:

procedimiento de bsqueda del rbol ptimo (f, f, c): para j = 0 hasta n hacer c [j, j] = 0, M j [, j] = f'j para d = 1 hasta n hacer para i = 0 a (n - d) hacer j = i + d M [i, j] = F [i, j - 1] + f '+ f'j c [i, j] = MIN (i <k <= j) (c [i, k - 1] + c [k, j]) + F [i, j]

[ editar ] Vase tambin


Bsqueda binaria rbol binario Uno mismo-equilibrio del rbol de bsqueda binaria rbol de bsqueda binaria aleatorios B-tree

You might also like