![Page 1: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/1.jpg)
Árboles
Cursos Propedéuticos 2015
Dr. René Cumplido M. en C. Luis Rodríguez Flores
![Page 2: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/2.jpg)
Contenido de la sección
• Introducción • Árbol genérico
– Definición y representación
• Árboles binarios – Definición, implementación, aplicaciones y recorridos
• Árboles binarios de Búsqueda – Definición y principales operaciones (insertar,
eliminar, buscar)
![Page 3: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/3.jpg)
Introducción
Hasta ahora, en todas las estructuras existen al menos dos operaciones:
• Insertar un elemento en el conjunto. • Buscar y/o descartar un elemento
¿Que limitaciones existen respecto a la
complejidad de sus operaciones básicas?
![Page 4: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/4.jpg)
Introducción
Una lista no ordenada tiene: • Costo de inserción O(1). • Costos de búsqueda O(n).
En el segundo caso la repetición de n operaciones
sobre la estructura da origen a complejidad n2.
![Page 5: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/5.jpg)
Introducción
Una lista ordenada en forma ascendente por prioridad, permite:
• Seleccionar el mínimo con costo O(1). • Insertar manteniendo el orden tiene costo
promedio O(n) en el peor caso.
![Page 6: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/6.jpg)
Introducción
La estructura de un árbol binario garantiza que las operaciones de inserción y eliminación sean de complejidad O( log2 (n) )
![Page 7: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/7.jpg)
¿Qué es un árbol?
Un árbol es un grafo A que tiene un único nodo llamado raíz que:
• Si tiene 0 relaciones se llama nodo hoja. • Si tiene un un número finito de relaciones donde cada una
de esas relaciones es un sub-árbol.
– Por tanto, un árbol es una estructura no secuencial.
![Page 8: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/8.jpg)
Ejemplo de un árbol
A
B D
G H I
C
E F
![Page 9: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/9.jpg)
Nomenclatura básica
• Todo nodo nj, exceptuando el raíz, está conectado exclusivamente a otro nodo nk donde: – nj es el padre de nk (e.g., B es el padre de E) – nk es uno de los hijos de nj (e.g., E es un hijo de B) – Nodos con el mismo padre son “hermanos” – Nodos sin hijos son llamados “hojas”
• Si existe una trayectoria del nodo nj al nodo nk entonces: – nj es antecesor de nk (e.g., A es antecesor de E) – nk es descendiente de nj (e.g., E es descendiente de E)
![Page 10: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/10.jpg)
Ejemplo
![Page 11: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/11.jpg)
Más nomenclatura
• La trayectoria del nodo n1 a nk se define como la secuencia de nodos n1,n2,…,nk, tal que ni es el padre de ni+1. Entonces: – La longitud de una trayectoria es el número de
ramas recorridas, es decir, K-1. – Nivel o profundidad del nodo ni es la longitud de la
trayectoria que va del nodo raíz a ni. • C tiene profundidad 1, mientras que I tiene profundidad 2.
– La altura del nodo ni es longitud de la trayectoria más larga de ni a una hoja.
• G tiene altura 0, B altura 1 y A (raíz) altura 2.
![Page 12: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/12.jpg)
Implementación
typedef struct { TipoDato dato; struct NodoArbol *hijo1; struct NodoArbol *hijo2; : struct NodoArbol *hijoN; } NodoArbol; typedef struct { TipoDato dato; struct NodoArbol *hijo; struct NodoArbol *hermano; } NodoArbol;
• Dos formas de implementar: – Tener un apuntador a cada uno
de los hijos. Problema cuando NO sabemos el número de hijos.
– Mantener los hijos de un nodo en una lista ligada. No hay ninguna restricción sobre número de hijos.
• Así, un nodo del árbol consiste en un dato, un apuntador al primer hijo y un apuntador a la lista de hermanos.
![Page 13: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/13.jpg)
Árboles binarios
• Un árbol binario es un árbol donde cada nodo puede tener como máximo dos hijos.
• Recursivamente un árbol binario puede definirse como: un árbol vacío, o un nodo raíz con un subárbol izquierdo y un subárbol derecho.
Raíz
Árbol izquierdo
Árbol derecho
![Page 14: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/14.jpg)
Árboles binarios
Un árbol binario es una estructura de datos de tipo árbol en donde cada uno de los nodos del árbol puede tener 0, 1, ó 2 subárboles llamados de acuerdo a su caso como:
• Si el nodo raíz tiene 0 relaciones se llama hoja. • Si el nodo raíz tiene 1 relación a la izquierda, el segundo
elemento de la relación es el subárbol izquierdo. • Si el nodo raíz tiene 1 relación a la derecha, el segundo
elemento de la relación es el subárbol derecho.
* Si cada nodo que NO es una hoja tiene un subárbol izquierdo y un subárbol derecho, entonces se trata de un árbol binario completo.
![Page 15: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/15.jpg)
Árboles binarios
Cuales de las siguientes figuras representa un árbol binario?
![Page 16: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/16.jpg)
Árboles binarios
• En un primer caso se tiene que el número de nodos n es tres; un nivel (m elementos entre los nodos en una trayectoria desde la raíz a las hojas) y altura h igual dos.
![Page 17: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/17.jpg)
Árboles binarios
Con dos niveles: n=7=23-1 m=2 h=3
Con tres niveles: n=15=24-1 m=3 h=4
En un caso general para árboles binarios completos: n = 2h -1, h = m +1 y h=log2 (n+1), despejando h de la primera relación.
![Page 18: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/18.jpg)
Árboles binarios • La altura, es el concepto importante para la
complejidad, ya que define el número de nodos a revisar en una trayectoria desde la raíz hasta las hojas.
• Cual es la altura h del árbol anterior?: • Si conocemos h, cual es el valor de n?:
![Page 19: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/19.jpg)
Árboles binarios
• Árboles binarios llenos: Cada nodo del árbol o es una hoja o un nodo interno con exáctamente dos hijos.
• Árbol binario completo: es aquel en el que todos los nodos tienen dos hijos y todas las hojas están en el mismo nivel. – cada nodo,excepto las hojas, tiene el máximo de
hijos que puede tener.
![Page 20: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/20.jpg)
Árboles binarios
¿Son completos?
¿Son llenos?
(a) (b)
![Page 21: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/21.jpg)
Implementación con arreglos
Posición 0 1 2 3 4 5 6 7 8 9 10 11
Padre -- 0 0 1 1 2 2 3 3 4 4 5
Hijo Izquierdo 1 3 5 7 9 11 -- -- -- -- -- --
Hijo Derecho 2 4 6 8 10 -- -- -- -- -- -- --
Hermano Izq -- -- 1 -- 3 -- 5 -- 7 -- 9 -- Hermano Der -- 2 -- 4 -- 6 -- 8 -- 10 -- --
![Page 22: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/22.jpg)
Implementación con apuntadores
• Los nodos del árbol son estructuras que almacenan los datos, y apuntadores a los subárboles de ese nodo.
H
Y
S
A L
D
Árbol Representación
del Árbol
Estructura del nodo del árbol
![Page 23: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/23.jpg)
Implementación
typedef struct NodoArbol *Arbol; struct NodoArbol { TipoDatol dato; struct NodoArbol *izq; struct NodoArbol *der; };
• Cada nodo del árbol consiste en: – Un dato (cualquier tipo) – Un apuntador al hijo izquierdo – Un apuntador al hijo derecho
• Inicialmente el nodo raíz apunta a NULL.
• En las hojas del árbol, los apuntadores hacia los hijos izquierdo y derecho son NULL.
![Page 24: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/24.jpg)
Operaciones con árboles binarios
• Con los árboles binarios es posible definir algunas operaciones primitivas, estas operaciones permiten obtener información de un nodo y sirven para desplazarse en el árbol, hacia arriba o hacia abajo.
![Page 25: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/25.jpg)
Operaciones con árboles binarios
• info(p) que devuelve el contenido del nodo apuntado por p. • left(p) devuelve un apuntador al hijo izquierdo del nodo
apuntado por p, o bien, devuelve NULL si el nodo apuntado por p es una hoja.
• right(p) devuelve un apuntador al hijo derecho del nodo apuntado por p, o bien, devuelve NULL si el nodo apuntado por p es una hoja.
• father(p) devuelve un apuntador al padre del nodo apuntado por p, o bien, devuelve NULL si el nodo apuntado por p es la raíz.
• brother(p) devuelve un apuntador al hermano del nodo apuntado por p, o bien, devuelve NULL si el nodo apuntado por p no tiene hermano.
![Page 26: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/26.jpg)
Operaciones con árboles binarios
Estas otras operaciones son lógicas, tienen que ver con la identidad de cada nodo:
• isLeft(p) devuelve el valor true si el nodo actual es el hijo izquierdo del nodo apuntado por p, y false en caso contrario.
• isRight(p) devuelve el valor true si el nodo actual es el hijo derecho del nodo apuntado por p, y false en caso contrario.
• isBrother(p) devuelve el valor true si el nodo actual es el hermano del nodo apuntado por p, y false en caso contrario.
![Page 27: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/27.jpg)
Operaciones con árboles binarios
• También son útiles las operaciones makeTree, setLeft y setRight.
• makeTree(x) crea un nuevo árbol binario que consta de
un único nodo con un campo de información x y devuelve un apuntador a ese nodo.
• setLeft(p,x) acepta un apuntador p a un nodo de árbol binario sin hijo izquierdo. Crea un nuevo hijo izquierdo de node(p) con el campo de información x.
• setRight(p,x) es similar, excepto que crea un hijo derecho.
![Page 28: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/28.jpg)
Aplicaciones de árboles binarios
Un árbol binario es una estructura de datos útil cuando se trata de hacer modelos de procesos en donde se requiere tomar decisiones en uno de dos sentidos en cada parte del proceso.
Supongamos que tenemos un arreglo en donde queremos encontrar todos los duplicados. Esta situación es bastante útil en el manejo de las bases de datos, para evitar la redundancia.
![Page 29: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/29.jpg)
Aplicaciones de árboles binarios
• El primer número del arreglo se coloca en la raíz del árbol con sus subárboles izquierdo y derecho vacíos.
• Luego, cada elemento del arreglo se compara son la
información del nodo raíz y se crean los nuevos hijos con el siguiente criterio:
– Si el elemento del arreglo es igual que la información del nodo raíz,
entonces notificar duplicidad. – Si el elemento del arreglo es menor que la información del nodo raíz,
entonces se crea un hijo izquierdo. – Si el elemento del arreglo es mayor que la información del nodo raíz,
entonces se crea un hijo derecho.
![Page 30: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/30.jpg)
Aplicaciones de árboles binarios
• Una vez que ya está creado el árbol, se pueden buscar los elementos repetidos. Si x el elemento buscado, se debe recorrer el árbol del siguiente modo:
• Sea k la información del nodo actual p. Si x > k entonces cambiar el nodo actual a right(p), en caso contrario, en caso de que x = k informar una ocurrencia duplicada y en caso de que x ≥ k cambiar el nodo actual a left(p).
![Page 31: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/31.jpg)
Aplicaciones de árboles binarios
![Page 32: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/32.jpg)
Recorridos de un árbol
Para obtener el contenido de todos los nodos en un árbol es necesario recorrer el árbol. Esto es debido a que solo tenemos conocimiento del contenido de la dirección de un nodo a la vez.
• El proceso de visitar los nodos en algún orden
se denomina recorrido.
• Cualquier recorrido que lista cada nodo del árbol exáctamente una vez se denomina una enumeración de los nodos del árbol.
![Page 33: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/33.jpg)
Recorridos de un árbol
• ¿cómo lo podemos recorrer?
![Page 34: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/34.jpg)
Recorridos estándar
• Preorder: – Visitar nodo – Visitar árbol izquierdo – Visitar árbol derecho
• Inorder: – Visitar árbol izquierdo – Visitar nodo – Visitar árbol derecho
• Postorder: – Visitar árbol izquierdo – Visitar árbol derecho – Visitar nodo
void inorder(NodoArbol *nodo) { if (nodo != NULL) { inorder(nodo->izq); visitar(nodo); inorder(nodo->der); } } void postorder(NodoArbol *nodo) { if (nodo != NULL) { postorder(nodo->izq); postorder(nodo->der); visitar(nodo); } }
![Page 35: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/35.jpg)
Ejemplo de recorridos
Preorden: A, B, D, E, C, F, G Inorden: D, B, E, A, F, C, G Postorden: D, E, B, F, G, C, A
A
B C
F G D E
![Page 36: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/36.jpg)
Árbol binario de búsqueda
• Es un árbol: – Una colección de nodos que puede ser vacía, o que en su defecto consiste de
un nodo raíz R y un número finito de estructuras tipo árbol T1,…,Tk, llamados subárboles, los cuales son disjuntos y sus respectivos nodos raíz están conectados a R.
• Es binario: – Cada nodo puede tener como máximo dos hijos, en otras palabras, cada nodo
sólo puede tener dos subárboles.
• Es de búsqueda porque: – Los nodos están ordenados de manera conveniente para la búsqueda. – Todos los elementos almacenados en el subárbol izquierdo de un nodo con valor
K, tienen valores < K. – Todos los elementos almacenados en el sub-árbol derecho de un nodo con valor
K, tienen valores >= K.
![Page 37: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/37.jpg)
Ejemplos
• ¿son todos árboles binarios de búsqueda?
6
2 8
3
1 4
6
2 8
3
1 4
7
2
7
1 8
6
5
4
![Page 38: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/38.jpg)
Operación INSERTAR
void insertar(NodoArbol *nodo, int elem){ if (nodo == NULL) { nodo=(NodoArbol *)malloc(sizeof(NodoArbol)); nodo->dato = elem; nodo->izq = nodo->der = NULL; } else if (elem < nodo->dato) nodo-izq = insertar(nodo->izq, elem); else if (elem > nodo->dato) nodo->der = insertar(nodo->der, elem); return nodo; }
6
2 8
3
1 4
5
Insertando 5
![Page 39: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/39.jpg)
Ejercicio
• Construya el árbol binario de búsqueda, al insertar secuencialmente los valores 5, 9, 3, 7, 8, 12, 6, 4.
![Page 40: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/40.jpg)
Operación BUSCAR
boolean buscar(NodoArbol *nodo, int elem) { if (nodo == NULL) return FALSE; else if (nodo->dato < elem) return buscar(nodo->izq, elem); else if (nodo->dato > elem) return buscar(nodo->der, elem); else return TRUE; }
6
2 8
3
1 4
Buscando 4: VERDADERO Buscando 7: FALSO
![Page 41: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/41.jpg)
Operación ELIMINAR (1)
• Existen cuatro distintos escenarios: 1. Intentar eliminar un nodo que no existe.
– No se hace nada, simplemente se regresa FALSE. 2. Eliminar un nodo hoja.
– Caso sencillo; se borra el nodo y se actualiza el apuntador del nodo padre a NULL.
3. Eliminar un nodo con un solo hijo. – Caso sencillo; el nodo padre del nodo a borrar se
convierte en el padre del único nodo hijo. 4. Eliminar un nodo con dos hijos.
– Caso complejo, es necesario mover más de un apuntador.
![Page 42: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/42.jpg)
ELIMINAR (casos sencillos)
6
2 8
3
1 4
6
2 8
3
1 4
Eliminar nodo hoja Eliminar 3
Eliminar nodo con un hijo Eliminar 4
![Page 43: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/43.jpg)
ELIMINAR (Caso complejo)
6
2 8
3
1 4
5
6
3 8
3
1 4
5
Eliminar nodo con dos hijos Eliminar 2
eliminar
copiar valor
• 1. Remplazar el dato del nodo que se desea eliminar con el dato del nodo más pequeño del subárbol derecho
2.Eliminar el nodo más pequeño del subárbol derecho (caso fácil)
![Page 44: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/44.jpg)
Otro ejemplo (caso complejo)
6
2 8
3
1 4
5
3.5
Eliminar nodo con dos hijos Eliminar 2
6
3 8
3
1 4
5
3.5
1
2 Eliminar 3. Eliminación de un nodo con un hijo.
![Page 45: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/45.jpg)
Ejercicio
• Dibujar el árbol resultante después de aplicar las siguientes eliminaciones de 20, 27, 14 y 22 al siguiente árbol.
![Page 46: Árboles - Coordinación de Ciencias Computacionales - INAOEccc.inaoep.mx/ingreso/programacion/corto2015/Curso-PROPE-PyED-6-Arboles.pdfUn árbol binario es una estructura de datos](https://reader033.vdocuments.pub/reader033/viewer/2022042012/5e729e8163840138972ec7c4/html5/thumbnails/46.jpg)
Implementación ELIMINAR
void eliminar(NodoArbol *nodo, int elem) { NodoArbol *aux, * hijo; if (nodo == NULL) return; /* no existe nodo */ /* recorrer árbol hasta encontrar elem */ else if (elem < nodo->dato) nodo-izq = eliminar(nodo->izq, elem); else if (elem > nodo->dato) nodo->der = eliminar(nodo->der, elem);
else /* encontramos el elemento */ /* tiene dos hijos */ if (nodo->izq && nodo->derecho){ aux = enontrar_min(nodo->der); nodo->dato = aux->dato; nodo->der = eliminar(
nodo->der; nodo->dato); } /* un solo hijo */ else { aux = nodo; if (nodo->izq == NULL) hijo = nodo->der; if (nodo->der == NULL) hijo = nodo->izq; free(aux); return hijo; } } return nodo; }