fbpx
Wikipedia

Árbol binario

En ciencias de la computación, un árbol binario es una estructura de datos en la cual cada nodo puede tener un hijo izquierdo y un hijo derecho. No pueden tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como referencia a null, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los árboles binarios son los árboles binarios de búsqueda, los montículos binarios y Codificación de Huffman.

Definición de teoría de grafos

 
Un árbol binario sencillo de tamaño 9, 3 niveles (nivel 0 hasta nivel 3) y altura 4 (altura = máximo nivel + 1), con un nodo raíz cuyo valor es 2.

En teoría de grafos, se usa la siguiente definición: «Un árbol binario es un grafo conexo, acíclico y no dirigido tal que el grado de cada vértice no es mayor a 2». De esta forma solo existe un camino entre un par de nodos.

Un árbol binario con enraizado es como un grafo que tiene uno de sus vértices, llamado raíz, de grado no mayor a 2. Con la raíz escogida, cada vértice tendrá un único padre, y nunca más de dos hijos. Si rehusamos el requerimiento de la conectividad, permitiendo múltiples componentes conectados en el grafo, llamaremos a esta última estructura un bosque'.

Tipos de árboles binarios

Un árbol binario es un árbol en el que ningún nodo puede tener más de dos subárboles. En un árbol binario cada nodo puede tener cero, uno o dos hijos (subárboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho.

Existen tipos de árboles binarios que suelen usarse para fines específicos, como:

Implementación en C

Un árbol binario puede declararse de varias maneras. Algunas de ellas son:

Estructura con manejo de memoria dinámica, siendo el puntero que apunta al árbol de tipo tArbol:

typedef struct nodo {  int clave;  struct nodo *izdo, *dcho; }Nodo; 

Estructura con arreglo indexado:

typedef struct tArbol { int clave; tArbol hIzquierdo, hDerecho; } tArbol; tArbol árbol[NUMERO_DE_NODOS]; 

En el caso de un árbol binario casi-completo (o un árbol completo), puede utilizarse un sencillo arreglo de enteros con tantas posiciones como nodos deba tener el árbol. La información de la ubicación del nodo en el árbol es implícita a cada posición del arreglo. Así, si un nodo está en la posición i, sus hijos se encuentran en las posiciones 2i+1 y 2i+2, mientras que su padre (si tiene), se encuentra en la posición truncamiento((i-1)/2) (suponiendo que la raíz está en la posición cero). Este método se beneficia de un almacenamiento más compacto y una mejor localidad de referencia, particularmente durante un recorrido en preorden. La estructura para este caso sería por tanto:

int árbol[NUMERO_DE_NODOS]; 

Recorridos sobre árboles binarios

Recorridos en profundidad

El método de este recorrido es tratar de encontrar de la cabecera a la raíz en nodo de unidad binaria. Ahora pasamos a ver la implementación de los distintos recorridos:

Recorrido en preorden

En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subárbol izquierdo y cuando se haya concluido, el subárbol derecho. Otra forma para entender el recorrido con este método sería seguir el orden: nodo raíz, nodo izquierda, nodo derecha.

En el árbol de la figura el recorrido en preorden sería: 2, 7, 2, 6, 5, 11, 5, 9 y 4.

void preorden(tArbol *a) { if (a != NULL) { tratar(a); //Realiza una operación en nodo preorden(a->hIzquierdo); preorden(a->hDerecho); } } 

Implementación en pseudocódigo de forma iterativa:

push(s,NULL); //insertamos en una pila (stack) el valor NULL, para asegurarnos de que esté vacía push(s,raíz); //insertamos el nodo raíz MIENTRAS (s <> NULL) HACER p = pop(s); //sacamos un elemento de la pila tratar(p); //realizamos operaciones sobre el nodo p SI (D(p) <> NULL) //preguntamos si p tiene árbol derecho ENTONCES push(s,D(p)); FIN-SI SI (I(p) <> NULL) //preguntamos si p tiene árbol izquierdo ENTONCES push(s,I(p)); FIN-SI FIN-MIENTRAS

Recorrido en postorden

En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo actual. Otra forma para entender el recorrido con este método sería seguir el orden: nodo izquierda, nodo derecha, nodo raíz. En el árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4, 9, 5 y 2.

void postorden(tArbol *a) { if (a != NULL) { postorden(a->hIzquiedo); postorden(a->hDerecho); tratar(a); //Realiza una operación en nodo } } 

Recorrido en inorden

En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el subárbol derecho. En un ABB este recorrido daría los valores de clave ordenados de menor a mayor. Otra forma para entender el recorrido con este método sería seguir el orden: nodo izquierda, nodo raíz, nodo derecha. En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 4, 9.

Esquema de implementación:

void inorden(tArbol *a) { if (a != NULL) { inorden(a->hIzquierdo); tratar(a); //Realiza una operación en nodo inorden(a->hDerecho); } } 

Recorridos en amplitud (o por niveles)

En este caso el recorrido se realiza en orden por los distintos niveles del árbol. Así, se comenzaría tratando el nivel 1, que solo contiene el nodo raíz, seguidamente el nivel 2, el 3 y así sucesivamente. En el árbol de la figura el recorrido en amplitud sería: 2, 7, 5, 2, 6, 9, 5, 11 y 4.

Al contrario que en los métodos de recorrido en profundidad, el recorrido por niveles no es de naturaleza recursiva. Por ello, se debe utilizar una cola para recordar los subárboles izquierdos y derecho de cada nodo.

El esquema algoritmo para implementar un recorrido por niveles es exactamente el mismo que el utilizado en la versión iterativa del recorrido en preorden pero cambiando la estructura de datos que almacena los nodos por una cola.

Implementación en C:

void arbol_recorrido_anch (tipo_Arbol* A) {  tipo_Cola cola_nodos; // esta cola esta implementada previamente, almacena punteros (posiciones de nodos de árbol)  tipo_Pos nodo_actual; // este es un puntero llevara el recorrido    if (vacio(A)) // si el árbol esta vacio, salimos  return;  cola_inicializa(&cola_nodos); // obvio, y necesario    cola_enqueue(A, &cola_nodos); // se encola la raíz    while (!vacia(&cola_nodos)) { // mientras la cola no se vacie se realizara el recorrido  nodo_actual = cola_dequeue(&cola_nodos) // de la cola saldran los nodos ordenados por nivel  printf("%c,", nodo_actual->info); // se "procesa" el nodo donde va el recorrido, en este caso se imprime  if (nodo_actual->izq != null) // si existe, ponemos el hijo izquierdo en la cola  cola_enqueue(nodo_actual->izq, &cola_nodos);    if (nodo_actual->der != null) // si existe, ponemos el hijo derecho en la cola  cola_enqueue(nodo_actual->der, &cola_nodos);  } // al vaciarse la cola se han visitado todos los nodos del árbol  } 

Creación de árboles a partir de los recorridos

Para poder dibujar un árbol binario sobre la base de los recorridos, se necesitan por lo menos dos de los recorridos de profundidad (en caso de que no se repitan los nodos, ya que si se repiten los nodos es recomendable tener los tres recorridos), ya sean inorden y preorden o inorden y postorden, la única diferencia entre usar el recorrido en preorden o postorden es que en preorden se usa el primer nodo para encontrar la raíz y en postorden se usa el último nodo.

El método consiste en ir dividiendo los recorridos del árbol en pequeños subárboles, se va encontrando la raíz con el preorden o postorden y se divide en dos subárboles basándonos en el recorrido en inorden. En el caso de que los nodos se repitan es conveniente tener los 3 recorridos para identificar más fácilmente cuál de los nodos es la raíz actual.

Para el árbol de la figura corresponden los siguientes recorridos:

Preorden  

Inorden  

Postorden  

Para encontrar la raíz es necesario tener el recorrido preorden o postorden, ya que la raíz es el primer nodo o el último nodo respectivamente. En este caso la raíz es el  .

Una vez encontrada la raíz, es necesario saber su posición en el recorrido inorden, del paso anterior se tiene el nodo  , pero existen 2 nodos con ese valor, el primero y el de en medio. Si el primer dos es la raíz, entonces no existe ninguna rama del lado izquierdo, en ese caso la siguiente raíz de acuerdo con el recorrido en postorden es   y de acuerdo con preorden es  , lo cual es una incongruencia, de esa forma sabemos que el otro   es la raíz.

Entonces marcamos la raíz en el recorrido inorden:

Preorden  

Inorden  

Postorden  

El recorrido inorden, es un recorrido de los árboles binarios en los que se empieza desde el nodo que se encuentra más a la izquierda de todos, sigue con la raíz y termina con los nodos del lado derecho, entonces, como en el recorrido inorden ya encontramos la raíz, la parte izquierda representa el subárbol izquierdo y la parte derecha representa el subárbol derecho.

En los recorridos tenemos 5 nodos a la izquierda del   y a la derecha se encuentran 3 valores, entonces podemos crear los recorridos para el subárbol izquierdo y el subárbol derecho

Subárbol izquierdo Subárbol derecho
Preorden   Preorden  
Inorden   Inorden  
Postorden   Postorden  

Se sigue repitiendo el proceso hasta encontrar todos los nodos del árbol, en este punto la siguiente raíz izquierda es el   y la raíz derecha el  .

Cuando se llegan a nodos en los que únicamente cuentan con una rama es necesario saber que rama es la derecha y cuál es la izquierda (para algunos árboles con balanceo como los AVL), por ejemplo siguiendo la rama de la derecha partiendo de que el   es la raíz el recorrido inorden es   entonces el siguiente nodo va a la derecha, no hay nodo a la izquierda, después, los recorridos para el subárbol son:

Preorden  

Inorden  

Postorden  

Finalmente el siguiente nodo se coloca a la izquierda del  .

Este método es 100% efectivo cuando no existen nodos repetidos, cuando los nodos se repiten la complejidad aumenta para poder descubrir cuál es el nodo raíz en el recorrido inorden.

Métodos para almacenar Árboles Binarios

Los árboles binarios pueden ser construidos a partir de lenguajes de programación de varias formas. En un lenguaje con registros y referencias, los árboles binarios son construidos típicamente con una estructura de nodos y punteros en la cual se almacenan datos, cada uno de estos nodos tiene una referencia o puntero a un nodo izquierdo y a un nodo derecho denominados hijos. En ocasiones, también contiene un puntero a un único nodo. Si un nodo tiene menos de dos hijos, algunos de los punteros de los hijos pueden ser definidos como nulos para indicar que no dispone de dicho nodo. En la figura adjunta se puede observar la estructura de dicha implementación.

Los árboles binarios también pueden ser almacenados como una estructura de datos implícita en vectores, y si el árbol es un árbol binario completo, este método no desaprovecha el espacio en memoria. Tomaremos como notación la siguiente: si un nodo tiene un índice i, sus hijos se encuentran en índices 2i + 1 y 2i + 2, mientras que sus padres (si los tiene) se encuentra en el índice   (partiendo de que la raíz tenga índice cero). Este método tiene como ventajas el tener almacenados los datos de forma más compacta y por tener una forma más rápida y eficiente de localizar los datos en particular durante un preoden transversal. Sin embargo, desperdicia mucho espacio en memoria.

 

Codificación de árboles n-arios como árboles binarios

Hay un mapeo uno a uno entre los árboles generales y árboles binarios, el cual en particular es usado en Lisp para representar árboles generales como árboles binarios. Cada nodo N ordenado en el árbol corresponde a un nodo N' en el árbol binario; el hijo de la izquierda de N’ es el nodo correspondiente al primer hijo de N, y el hijo derecho de N' es el nodo correspondiente al siguiente hermano de N, es decir, el próximo nodo en orden entre los hijos de los padres de N.

Esta representación como árbol binario de un árbol general, se conoce a veces como un árbol binario primer hijo hermano, o un árbol doblemente encadenado.

Una manera de pensar acerca de esto es que los hijos de cada nodo estén en una lista enlazada, encadenados junto con el campo derecho, y el nodo solo tiene un puntero al comienzo o la cabeza de esta lista, a través de su campo izquierdo.

Por ejemplo, en el árbol de la izquierda, la A tiene 6 hijos (B, C, D, E, F, G). Puede ser convertido en el árbol binario de la derecha:

 

El árbol binario puede ser pensado como el árbol original inclinado hacia los lados, con los bordes negros izquierdos representando el primer hijo y los azules representado los siguientes hermanos.

Las hojas del árbol de la izquierda serían escritas en Lisp como:

 (((N O) I J) C D ((P) (Q)) F (M)) 

Que se ejecutará en la memoria como el árbol binario de la derecha, sin ningún tipo de letras en aquellos nodos que tienen un hijo izquierdo.

Véase también

Enlaces externos

  • Árbol binario de búsqueda en PHP
  •   Datos: Q380172
  •   Multimedia: Binary trees / Q380172

Árbol, binario, este, artículo, sección, necesita, referencias, aparezcan, publicación, acreditada, este, aviso, puesto, noviembre, 2011, ciencias, computación, árbol, binario, estructura, datos, cual, cada, nodo, puede, tener, hijo, izquierdo, hijo, derecho, . Este articulo o seccion necesita referencias que aparezcan en una publicacion acreditada Este aviso fue puesto el 2 de noviembre de 2011 En ciencias de la computacion un arbol binario es una estructura de datos en la cual cada nodo puede tener un hijo izquierdo y un hijo derecho No pueden tener mas de dos hijos de ahi el nombre binario Si algun hijo tiene como referencia a null es decir que no almacena ningun dato entonces este es llamado un nodo externo En el caso contrario el hijo es llamado un nodo interno Usos comunes de los arboles binarios son los arboles binarios de busqueda los monticulos binarios y Codificacion de Huffman Indice 1 Definicion de teoria de grafos 2 Tipos de arboles binarios 3 Implementacion en C 4 Recorridos sobre arboles binarios 4 1 Recorridos en profundidad 4 1 1 Recorrido en preorden 4 1 2 Recorrido en postorden 4 1 3 Recorrido en inorden 4 2 Recorridos en amplitud o por niveles 4 3 Creacion de arboles a partir de los recorridos 5 Metodos para almacenar Arboles Binarios 6 Codificacion de arboles n arios como arboles binarios 7 Vease tambien 8 Enlaces externosDefinicion de teoria de grafos Editar Un arbol binario sencillo de tamano 9 3 niveles nivel 0 hasta nivel 3 y altura 4 altura maximo nivel 1 con un nodo raiz cuyo valor es 2 En teoria de grafos se usa la siguiente definicion Un arbol binario es un grafo conexo aciclico y no dirigido tal que el grado de cada vertice no es mayor a 2 De esta forma solo existe un camino entre un par de nodos Un arbol binario con enraizado es como un grafo que tiene uno de sus vertices llamado raiz de grado no mayor a 2 Con la raiz escogida cada vertice tendra un unico padre y nunca mas de dos hijos Si rehusamos el requerimiento de la conectividad permitiendo multiples componentes conectados en el grafo llamaremos a esta ultima estructura un bosque Tipos de arboles binarios EditarUn arbol binario es un arbol en el que ningun nodo puede tener mas de dos subarboles En un arbol binario cada nodo puede tener cero uno o dos hijos subarboles Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho Existen tipos de arboles binarios que suelen usarse para fines especificos como Arbol binario de busqueda Arbol de FibonacciImplementacion en C EditarUn arbol binario puede declararse de varias maneras Algunas de ellas son Estructura con manejo de memoria dinamica siendo el puntero que apunta al arbol de tipo tArbol typedef struct nodo int clave struct nodo izdo dcho Nodo Estructura con arreglo indexado typedef struct tArbol int clave tArbol hIzquierdo hDerecho tArbol tArbol arbol NUMERO DE NODOS En el caso de un arbol binario casi completo o un arbol completo puede utilizarse un sencillo arreglo de enteros con tantas posiciones como nodos deba tener el arbol La informacion de la ubicacion del nodo en el arbol es implicita a cada posicion del arreglo Asi si un nodo esta en la posicion i sus hijos se encuentran en las posiciones 2i 1 y 2i 2 mientras que su padre si tiene se encuentra en la posicion truncamiento i 1 2 suponiendo que la raiz esta en la posicion cero Este metodo se beneficia de un almacenamiento mas compacto y una mejor localidad de referencia particularmente durante un recorrido en preorden La estructura para este caso seria por tanto int arbol NUMERO DE NODOS Recorridos sobre arboles binarios EditarRecorridos en profundidad Editar El metodo de este recorrido es tratar de encontrar de la cabecera a la raiz en nodo de unidad binaria Ahora pasamos a ver la implementacion de los distintos recorridos Recorrido en preorden Editar En este tipo de recorrido se realiza cierta accion quizas simplemente imprimir por pantalla el valor de la clave de ese nodo sobre el nodo actual y posteriormente se trata el subarbol izquierdo y cuando se haya concluido el subarbol derecho Otra forma para entender el recorrido con este metodo seria seguir el orden nodo raiz nodo izquierda nodo derecha En el arbol de la figura el recorrido en preorden seria 2 7 2 6 5 11 5 9 y 4 void preorden tArbol a if a NULL tratar a Realiza una operacion en nodo preorden a gt hIzquierdo preorden a gt hDerecho Implementacion en pseudocodigo de forma iterativa push s NULL insertamos en una pila stack el valor NULL para asegurarnos de que este vacia push s raiz insertamos el nodo raiz MIENTRAS s lt gt NULL HACER p pop s sacamos un elemento de la pila tratar p realizamos operaciones sobre el nodo p SI D p lt gt NULL preguntamos si p tiene arbol derecho ENTONCES push s D p FIN SI SI I p lt gt NULL preguntamos si p tiene arbol izquierdo ENTONCES push s I p FIN SI FIN MIENTRAS Recorrido en postorden Editar En este caso se trata primero el subarbol izquierdo despues el derecho y por ultimo el nodo actual Otra forma para entender el recorrido con este metodo seria seguir el orden nodo izquierda nodo derecha nodo raiz En el arbol de la figura el recorrido en postorden seria 2 5 11 6 7 4 9 5 y 2 void postorden tArbol a if a NULL postorden a gt hIzquiedo postorden a gt hDerecho tratar a Realiza una operacion en nodo Recorrido en inorden Editar En este caso se trata primero el subarbol izquierdo despues el nodo actual y por ultimo el subarbol derecho En un ABB este recorrido daria los valores de clave ordenados de menor a mayor Otra forma para entender el recorrido con este metodo seria seguir el orden nodo izquierda nodo raiz nodo derecha En el arbol de la figura el recorrido en inorden seria 2 7 5 6 11 2 5 4 9 Esquema de implementacion void inorden tArbol a if a NULL inorden a gt hIzquierdo tratar a Realiza una operacion en nodo inorden a gt hDerecho Recorridos en amplitud o por niveles Editar En este caso el recorrido se realiza en orden por los distintos niveles del arbol Asi se comenzaria tratando el nivel 1 que solo contiene el nodo raiz seguidamente el nivel 2 el 3 y asi sucesivamente En el arbol de la figura el recorrido en amplitud seria 2 7 5 2 6 9 5 11 y 4 Al contrario que en los metodos de recorrido en profundidad el recorrido por niveles no es de naturaleza recursiva Por ello se debe utilizar una cola para recordar los subarboles izquierdos y derecho de cada nodo El esquema algoritmo para implementar un recorrido por niveles es exactamente el mismo que el utilizado en la version iterativa del recorrido en preorden pero cambiando la estructura de datos que almacena los nodos por una cola Implementacion en C void arbol recorrido anch tipo Arbol A tipo Cola cola nodos esta cola esta implementada previamente almacena punteros posiciones de nodos de arbol tipo Pos nodo actual este es un puntero llevara el recorrido if vacio A si el arbol esta vacio salimos return cola inicializa amp cola nodos obvio y necesario cola enqueue A amp cola nodos se encola la raiz while vacia amp cola nodos mientras la cola no se vacie se realizara el recorrido nodo actual cola dequeue amp cola nodos de la cola saldran los nodos ordenados por nivel printf c nodo actual gt info se procesa el nodo donde va el recorrido en este caso se imprime if nodo actual gt izq null si existe ponemos el hijo izquierdo en la cola cola enqueue nodo actual gt izq amp cola nodos if nodo actual gt der null si existe ponemos el hijo derecho en la cola cola enqueue nodo actual gt der amp cola nodos al vaciarse la cola se han visitado todos los nodos del arbol Creacion de arboles a partir de los recorridos Editar Para poder dibujar un arbol binario sobre la base de los recorridos se necesitan por lo menos dos de los recorridos de profundidad en caso de que no se repitan los nodos ya que si se repiten los nodos es recomendable tener los tres recorridos ya sean inorden y preorden o inorden y postorden la unica diferencia entre usar el recorrido en preorden o postorden es que en preorden se usa el primer nodo para encontrar la raiz y en postorden se usa el ultimo nodo El metodo consiste en ir dividiendo los recorridos del arbol en pequenos subarboles se va encontrando la raiz con el preorden o postorden y se divide en dos subarboles basandonos en el recorrido en inorden En el caso de que los nodos se repitan es conveniente tener los 3 recorridos para identificar mas facilmente cual de los nodos es la raiz actual Para el arbol de la figura corresponden los siguientes recorridos Preorden 2 7 2 6 5 11 5 9 4 displaystyle 2 7 2 6 5 11 5 9 4 Inorden 2 7 5 6 11 2 5 4 9 displaystyle 2 7 5 6 11 2 5 4 9 Postorden 2 5 11 6 7 4 9 5 2 displaystyle 2 5 11 6 7 4 9 5 2 Para encontrar la raiz es necesario tener el recorrido preorden o postorden ya que la raiz es el primer nodo o el ultimo nodo respectivamente En este caso la raiz es el 2 displaystyle 2 Una vez encontrada la raiz es necesario saber su posicion en el recorrido inorden del paso anterior se tiene el nodo 2 displaystyle 2 pero existen 2 nodos con ese valor el primero y el de en medio Si el primer dos es la raiz entonces no existe ninguna rama del lado izquierdo en ese caso la siguiente raiz de acuerdo con el recorrido en postorden es 5 displaystyle 5 y de acuerdo con preorden es 7 displaystyle 7 lo cual es una incongruencia de esa forma sabemos que el otro 2 displaystyle 2 es la raiz Entonces marcamos la raiz en el recorrido inorden Preorden 2 7 2 6 5 11 5 9 4 displaystyle underline 2 7 2 6 5 11 5 9 4 Inorden 2 7 5 6 11 2 5 4 9 displaystyle 2 7 5 6 11 underline 2 5 4 9 Postorden 2 5 11 6 7 4 9 5 2 displaystyle 2 5 11 6 7 4 9 5 underline 2 El recorrido inorden es un recorrido de los arboles binarios en los que se empieza desde el nodo que se encuentra mas a la izquierda de todos sigue con la raiz y termina con los nodos del lado derecho entonces como en el recorrido inorden ya encontramos la raiz la parte izquierda representa el subarbol izquierdo y la parte derecha representa el subarbol derecho En los recorridos tenemos 5 nodos a la izquierda del 2 displaystyle 2 y a la derecha se encuentran 3 valores entonces podemos crear los recorridos para el subarbol izquierdo y el subarbol derecho Subarbol izquierdo Subarbol derechoPreorden 7 2 6 5 11 displaystyle 7 2 6 5 11 Preorden 5 9 4 displaystyle 5 9 4 Inorden 2 7 5 6 11 displaystyle 2 7 5 6 11 Inorden 5 4 9 displaystyle 5 4 9 Postorden 2 5 11 6 7 displaystyle 2 5 11 6 7 Postorden 4 9 5 displaystyle 4 9 5 Se sigue repitiendo el proceso hasta encontrar todos los nodos del arbol en este punto la siguiente raiz izquierda es el 7 displaystyle 7 y la raiz derecha el 5 displaystyle 5 Cuando se llegan a nodos en los que unicamente cuentan con una rama es necesario saber que rama es la derecha y cual es la izquierda para algunos arboles con balanceo como los AVL por ejemplo siguiendo la rama de la derecha partiendo de que el 5 displaystyle 5 es la raiz el recorrido inorden es 5 4 9 displaystyle 5 4 9 entonces el siguiente nodo va a la derecha no hay nodo a la izquierda despues los recorridos para el subarbol son Preorden 9 4 displaystyle 9 4 Inorden 4 9 displaystyle 4 9 Postorden 4 9 displaystyle 4 9 Finalmente el siguiente nodo se coloca a la izquierda del 9 displaystyle 9 Este metodo es 100 efectivo cuando no existen nodos repetidos cuando los nodos se repiten la complejidad aumenta para poder descubrir cual es el nodo raiz en el recorrido inorden Metodos para almacenar Arboles Binarios EditarLos arboles binarios pueden ser construidos a partir de lenguajes de programacion de varias formas En un lenguaje con registros y referencias los arboles binarios son construidos tipicamente con una estructura de nodos y punteros en la cual se almacenan datos cada uno de estos nodos tiene una referencia o puntero a un nodo izquierdo y a un nodo derecho denominados hijos En ocasiones tambien contiene un puntero a un unico nodo Si un nodo tiene menos de dos hijos algunos de los punteros de los hijos pueden ser definidos como nulos para indicar que no dispone de dicho nodo En la figura adjunta se puede observar la estructura de dicha implementacion Los arboles binarios tambien pueden ser almacenados como una estructura de datos implicita en vectores y si el arbol es un arbol binario completo este metodo no desaprovecha el espacio en memoria Tomaremos como notacion la siguiente si un nodo tiene un indice i sus hijos se encuentran en indices 2i 1 y 2i 2 mientras que sus padres si los tiene se encuentra en el indice i 1 2 displaystyle left lfloor frac i 1 2 right rfloor partiendo de que la raiz tenga indice cero Este metodo tiene como ventajas el tener almacenados los datos de forma mas compacta y por tener una forma mas rapida y eficiente de localizar los datos en particular durante un preoden transversal Sin embargo desperdicia mucho espacio en memoria Codificacion de arboles n arios como arboles binarios EditarHay un mapeo uno a uno entre los arboles generales y arboles binarios el cual en particular es usado en Lisp para representar arboles generales como arboles binarios Cada nodo N ordenado en el arbol corresponde a un nodo N en el arbol binario el hijo de la izquierda de N es el nodo correspondiente al primer hijo de N y el hijo derecho de N es el nodo correspondiente al siguiente hermano de N es decir el proximo nodo en orden entre los hijos de los padres de N Esta representacion como arbol binario de un arbol general se conoce a veces como un arbol binario primer hijo hermano o un arbol doblemente encadenado Una manera de pensar acerca de esto es que los hijos de cada nodo esten en una lista enlazada encadenados junto con el campo derecho y el nodo solo tiene un puntero al comienzo o la cabeza de esta lista a traves de su campo izquierdo Por ejemplo en el arbol de la izquierda la A tiene 6 hijos B C D E F G Puede ser convertido en el arbol binario de la derecha El arbol binario puede ser pensado como el arbol original inclinado hacia los lados con los bordes negros izquierdos representando el primer hijo y los azules representado los siguientes hermanos Las hojas del arbol de la izquierda serian escritas en Lisp como N O I J C D P Q F M Que se ejecutara en la memoria como el arbol binario de la derecha sin ningun tipo de letras en aquellos nodos que tienen un hijo izquierdo Vease tambien EditarArbol estructura de datos Arbol multirramaEnlaces externos EditarArbol binario de busqueda en PHP Datos Q380172 Multimedia Binary trees Q380172 Obtenido de https es wikipedia org w index php title Arbol binario amp oldid 141920290, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos