Upload
jorge-marcillo
View
217
Download
0
Embed Size (px)
Citation preview
8/18/2019 Ejercicios_Resueltos_Arboles
1/27
Arboles
1.- Grafique el árbol que contiene el código de Huffman y complete la tabla dadas las siguientes frecuencias.
Letra Frecuencia Código de Huffman
A 18
E 20
I 32
O 5
U 7
b Codificar las cadenas!
1AA"#$%" &%A%A"#
c 'ecodificar las cadenas de bits!
1((((1((1(((1((((((1 &1(1((1((1(((((1(((1
)olución!
Un algoritmo para construir arboles de Huffman consiste en lo siguiente
!efinimos un con"unto de nodos# en donde cada nodo representa las letra como un nodo de un $rbol# eti%uetamos las
frecuencias definidas para cada letra# tal & como muestra la siguiente figura
Empe'amos con las dos letras de menor frecuencia# estas se unen & crean un nue(o s)mbolo# la frecuencia del nue(o
nodo es la suma de los dos anteriores# agregamos el nue(o s)mbolo al con"unto de las letras* Obser(e %ue el grupo de
letras se (uel(e mas pe%ue+o* Asumiremos %ue el elemento con menor frecuencia ira siempre a la i'%uierda* El $rbol
formado se muestra a continuaci,n*
Hacemos esto -asta %ue no %ueden nodos en el con"unto*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
2/27
ara concluir# en este caso# (amos a marcar los -i"os i'%uierdos con el numero uno & los derec-os con el cero* odemos
omitir las eti%uetas de las frecuencias * El $rbol de Huffman resultante se presenta a continuaci,n
os c,digos ser$n los siguientes
A! 000 "! 01 #!1 $!0011 %!0010
Codificar las cadenas! 14AAEIOUE0000000110011001001 24UAUAEI00100000010000011
'ecodificar las cadenas de bits! 140000100100010000001AEEAIAAI 241010010010000010001IEUEAU
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
3/27
&- 'ado el siguiente árbol binario completo* con+iertalo en un árbol parcialmente ordenado. "n la ra, debe estar el
mayor de todos.
)olución!
.ecordemos la definici,n de un $rbol parcialmente ordenado Un $rbol parcialmente ordenado tiene dos principales
caracter)sticas
6 Es un $rbol binario completo# es decir %ue todos sus ni(eles est$n completos a ecepci,n del ultimo ni(el en donde
las -o"as (an a apareciendo seguidas de i'%uierda a derec-a*
6 iene definida alguna propiedad de orden# por e"emplo entre ra)' e -i"os# la ra)' contiene el menor de todos*El $rbol presentado en el problema es un $rbol binario completo# lo %ue debemos -acer es a"ustar los nodos del $rbol
de tal forma %ue se cumpla la propiedad de orden# en este caso en la ra)' debe estar el ma&or de todos* ara facilitar la
eplicaci,n de la resoluci,n del problema (amos a eti%uetar los nodos del $rbol
Empe'aremos desde el pen9ltimo ni(el del $rbol:ni(el dos4 iremos (erificando si el (alor de la ra)' de cada subarbol es
ma&or %ue los (alores de sus -i"os* or e"emplo el subarbol con ra)' en el nodo 7 almacena el (alor ;3# (erificamos con
los nodos -i"os falso# debemos intercambiar el (alor de los nodos* A-ora la ra)' almacena el (alor de 83#
(ol(emos a (erificar el (alor de la nue(a ra)' con los nodos -i"os (erdadero# # tambin es (erdadero*
Hacemos esto para todas las ra)ces en ese ni(el# teniendo lo siguiente
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
4/27
A-ora a"ustamos desde el ni(el 1* Hagamos el an$lisis para el subarbol %ue tiene por ra)' el nodo 2# %ue almacena el
(alor ?7*
8/18/2019 Ejercicios_Resueltos_Arboles
5/27
"n la tabla proporcionada a continuación se encuentran las frecuencias aproimadas de las / letras mas frecuentes
en el idioma castellano. Construya un árbol de Huffman considerando que!
- "n el árbol binario* la rama iquierda se codifica con cero y la derec0a con uno.
- )e debe poner siempre a la iquierda al elemento con menor frecuencia* el momento de unir dos s,mbolos. )i
coinciden en frecuencia se orden alfabticamente.
Letra Frecuencia
E 15
A 1?
O 11
10
. 8
B 7
I ;
! 5
?
"n base al código construido decodifique la siguiente cadena!
(11(11((((11(1(11111 (11111111(1((1((111
)olución!
Antes de empe'ar a resol(er el problema tenemos %ue tener mu& claro %ue para este caso el teto detalla
epl)citamente como debe ser construido el $rbol de Huffman# en donde codificaremos los sub$rboles i'%uierdos con
el cero & los sub$rboles derec-os con el uno* /onsidere tambin %ue el elemento de menor frecuencia (a siempre a la
i'%uierda* /on estas consideraciones a-ora procederemos a aplicar el algoritmo %ue &a conocemos para resol(er este
tipo de e"ercicios*
!efinimos un con"unto de elementos# en donde cada elemento del mismo representa un nodo de un $rbol %ue
almacena una letra con su respecti(a frecuencia*
eleccionamos las dos letras de menor frecuencia# estas se unen & crean un nue(o s)mbolo# la frecuencia del nue(o
nodo es la suma de los dos anteriores# agregamos el nue(o s)mbolo al con"unto de las letras* En un principio nuestro
$rbol de Huffman estar$ conformado por los dos nodos de menor frecuencia pre(iamente seleccionados*
/ontinuamos con este mismo procedimiento -asta %ue &a no %ueden nodos por seleccionar*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
6/27
Obser(e %ue en el proceso se forman (arios arboles binarios*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
7/27
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
8/27
El $rbol resultante es el %ue se muestra a continuaci,n# obser(e %ue se cumplen estrictamente las indicaciones del
teto*
os c,digos obtenidos se detallan a continuaci,n
E 00
A 111
100O 101
. 010
0110
! 0111
I 1100
B 1101
El significado de la cadena 011011000011010111111 0111111110100100111 es IEB!A !ABEA
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
9/27
2.- "l profesor Gig A. 3yte necesita almacenar teto formado con los caracteres A*3*C*'*" que ocurren con las
siguientes frecuencias!
Letra Frecuencia
A ;
C 2
/ 3
! 2
E 8
"l profesor 3yte sugiere usar los códigos de longitud +ariable!
Carácter Código
A 1
C 0 0
/ 0 1
! 10
E 0
Los cuales* asegura* almacenan teto en menos espacio que el usado por un cogido Huffman optimo 4"sta en lo
correcto el profesor5 "plique su respuesta.
El problema se resume en lo siguiente# El profesor Dig A* C&te le presenta a usted una opci,n alternati(a para codificar
letras* El argumento principal %ue el profesor usa para "ustificar %ue su soluci,n es optima consiste en %ue los c,digos
%ue el proponen ocupan menos espacio %ue un c,digo de Huffman optimo* A usted se le pregunta si la tesis del
profesor C&te es correcta*
abemos mu& bien %ue cuando buscamos codificar un con"unto de caracteres# siempre %ueremos %ue los caracteres
con ma&or frecuencia ocupen un menor espacio# & los caracteres de menor frecuencia ocupen ma&or espacio* A simple
(ista el modelo propuesto por el profesor C&te cumple esta condici,n* ero cuando proponemos un c,digo pararepresentar un car$cter debemos asegurarnos de un detalle mu& importante#e(itar la ambigedad* El c,digo
propuesto es ambiguo & confuso* or e"emplo la cadena 00 podr)a significar el car$cter C o tambin la palabra EE* As)
eiste un sin numero de cadenas %ue podr)an representar (arios significados* or conclusi,n el c,digo propuesto no es
correcto*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
10/27
8/18/2019 Ejercicios_Resueltos_Arboles
11/27
El elemento %ue sigue es el 11* Este numero es menor %ue la rai' 17# esto supone %ue se debe insertar en el subarbol
i'%uierdo* A-ora (emos %ue el once es ma&or %ue la rai' @ entonces debe ir en el subarbol derec-o* El 11 es menor
%ue la rai' 12 entonces debera ubicarse en la i'%uierda de dic-o nodo*
eguimos con este procedimiento -asta %ue &a no %ueden elementos para insertar*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
12/27
El arbol resultante es el %ue se muestra a continuaci,n# obser(e %ue siempre se conser(an las caracteristicas propias
de un Arbol Cinario de Cus%ueda*
b4 ara eliminar un nodo p de un Arbol Cinario de Cus%ueda# primero locali'amos la ubicacion de dic-o nodo en el
arbol* ara este caso en particular# el nodo a eliminar es la rai' del arbol* ara eliminar la rai'# debemos buscar un nodo
F %ue sea el ma&or de las cla(es menores*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
13/27
Intercambiamos la cla(e del nodo p con el nodo F* Eliminamos el nodo F*
Ga %ue el nodo F tiene un solo nodo -i"o# basta con intercambiar estas cla(es* a cla(e 17 debe ba"ar -asta %ue sea un
nodo -o"a del arbol*
or ultimo simplemente se remue(e el nodo -o"a con la cla(e 17# el estado final del arbol se muestra a continuaci,n*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
14/27
)e quiere en+iar por internet la siguiente imagen 7e tcnica podr,a utiliar para comprimir la información de esta imagen5
b 'e la tcnica seleccionada* describa como se calcular,an los +alores de sus parámetros en base a los datos del
problema.
c 4>ue porcenta;e de reducción de bits a en+iar puede lograr al aplicar la tcnica seleccionada por usted*
;ustifique su cálculo5d 4>u otro mecanismo cree usted que puede usarse para reducir a7n más la cantidad de bits a en+iar5
a4 odemos usar un arbol de Huffman# en donde cada nodo del arbol (a a representar un color# el arbol lo (amos a
construir en funcion de las frecuencias de cada color en la imagen* !e esta forma al en(iar la imagen por e"emplo el
numero entero 30 %ue representa a un color en particular# se en(iara con un codigo %ue ocupe un menor tama+o*
b4 as frecuencias serian
?umero Frecuencia
0 12
15 8
25 12
30 18
eguimos el mismo procedimiento %ue &a conocemos para formar un arbol de Huffman obteniendo lo siguiente
Color Código
0 0 0
15 0 1
25 1 0
30 1 1
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
0 0 3 0 0 0
0 15 30 15 0
15 25 30 25 15
25 25 30 25 2530 30 30 30 30
30 30 30 30 30
25 25 30 25 25
15 25 30 25 15
0 15 30 15 0
0 0 3 0 0 0
8/18/2019 Ejercicios_Resueltos_Arboles
15/27
c4odemos (er la imagen como una matri' de 10 filas con 5 columnas# en cada celda -a& un numero entero %ue
representa 8 bits# como tenemos 50 celdas la imagen tendra un tama+o de 508 bits* Aplicando el mecanismo %ue
-emos descrito# cada numero representara 2 bits# entonces en total seria 502 bits*
d4 Obser(ando bien la imagen podemos notar %ue a partir de la fila 5* la imagen se refle"a* Es decir la fila ; es la misma
%ue la fila 5# la fila 7 es igual %ue la fila ?# la fila 3 es la misma %ue la fila 8# la fila 2 es igual %ue la fila @ & por ultimo la
ultima fila es la misma %ue la primera* odemos usar un mecanismo para en(iar la mitad de la imagen & %ue esta se
refle"e con respecto a la fila cinco* Ademas de esto tambien podemos asegurarnos %ue en el momento de construir el
arbol de Huffman para esta imagen# el arbol debe mantenerse siempre e%uilibrado# esto -ace %ue los codigosgenerados ocupen menor espacio*
"scriba un función llamada int SumarArbol que* dado un árbol binario retorne la suma de todos los +alores de
sus cla+es.
En esta funci,n nos piden %ue sumemos todos los (alores almacenados en el campo Fe& del !A Boderee#
resol(eremos esto de forma recursi(a* o primero %ue (amos a (erificar es %ue la referencia del nodo %ue (iene por
par$metro es (alida* uego de esto (amos a definir el caso base & las llamadas recursi(as* Imaginemos %ue tenemos un
simple $rbol de una ra)' & tan solo dos -i"os# estos dos -i"os son nodos -o"as de ese $rbol# nuestra funci,n deber)a
sumar la cla(e de la -o"a i'%uierda con la cla(e de la -o"a derec-a & con la cla(e de la ra)'*
A-ora pensemos en un $rbol mas etenso# el problema se resuel(e de la misma forma# sumar las cla(es del subarbol
i'%uierdo con las cla(es del subarbol derec-o & la cla(e de la ra)'* Es decir el problema de sumar las cla(es del subarbol
i'%uierdo o derec-o es un problema del mismo tipo %ue el problema original de a%u) la naturale'a recursi(a de estaimplementaci,n*
El caso base o fin de la recursion sera cuando tengamos problemas tan pe%ue+os %ue su soluci,n es simple# esto sera
cuando lleguemos a un nodo -o"a# en donde retornaremos la cla(e %ue almacena dic-o nodo* as llamadas recursi(as
empie'an cuando el $rbol %ue estemos tratando no sea una -o"a# para ese caso llamaremos a la funci,n de nue(o
en(i$ndole el subarbol i'%uierdo sumado con otra llamada en donde en(iamos el subarbol derec-o & esto a su (e'
sumado con el contenido de la cla(e de la ra)'*
a siguiente soluci,n resuel(e el problema planteado# se recomienda %ue -aga una prueba de escritorio para %ue se
asegure %ue todo funciona como deber)a*
int sumar/la(es:ree A4
if :A BU4
if : A6=left BU JJ A6=rig-t BU4
return integerDet:A6=Fe&4K L else
return sumar/la(es:A6=left4 M sumar/la(es:A6=rig-t4 M integerDet:A6=Fe&4K
L
Lelse
return 0K
L
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
16/27
"scriba una función recursi+a espe;o que para un árbol binario retorne el árbol in+ertido* como se muestra en la
figura!
)olucion!
El problema simplemente consiste en intercambiar los punteros eft & .ig-t de un $rbol* Esta operaci,n se la -ar$
tantas (eces como ra)ces eistan en el $rbol* El c,digo a continuaci,n resuel(e el problema descrito# obser(e %ue una
(e' %ue se reali'a la operaci,n de intercambio se (uel(e a llamar a la funci,n en(i$ndole las referencias a los
subarboles i'%uierdo & derec-o# el final de llamadas sera cuando encontremos un nodo -o"a# en donde simplemente
no se debe -acer nada*
int esHo"a:BodereeNnodo4
if:nodoBU4
return 0K
L
if:nodo6=leftBUJJnodo6=rig-tBU4
return 1K
L
return 0K
L
(oid espe"o:ree A4
BodereeNtmpK
if :A BU4
if :esHo"a:A44
returnK
L else
tmp A6=leftK
A6=left A6=rig-tK
A6=rig-t tmpK
espe"o:A6=rig-t4K
espe"o:A6=left4K
L Lelse
returnK
L
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
17/27
'ado un árbol con enteros almacenados 7nicamente en los nodos 0o;as* implemente una función recursi+a que
llene los nodos internos con +alores enteros de tal manera que cada nodo almacene un entero igual a la suma de
sus 0i;os.
E ;emplo!
Árbol antes de la llamada función: Árbol después de llamar a la función:
)olucion!
Esta funcion debe ser recursi(a* El prototipo sera como sigue int llenarBodos:ree arbol4K mas adelante eplicaremos
por%ue retornamos un entero*
Buestro ob"eti(o es ir llenando el arbol desde los nodos -i"os# pasando por los nodos internos del arbol -asta llegar a
la rai'* El teto describe %ue un nodo padre almacenara la suma de los (alores de sus nodos -i"os*
a funcion implementada en la libreria int nodereeIseaf:Boderee Np4 nos retorna uno si p es un nodo -o"a & cero si
no lo es*
a condicion de salida de la recursion sera cuando lleguemos a un nodo -o"a# en ese momento retornamos el (alor %ue
almacena ese nodo# por esto era necesario declarar el prototipo de la funcion como lo -icimos*
i el nodo en analis no es -o"a entonces debe tener nodos -i"os* A-ora (eamos la siguiente linea de codigo int
sumallenarBodos:nodereeDeteft:arbol44 M llenarBodos:nodereeDeteft:arbol44K
as funciones BodereeNnodereeDeteft:ree A4 & BodereeNnodereeDet.ig-t:ree A4 nos retornan las referencias
del subarbol i'%uierdo & el subarbol derec-o del arbol A respecti(amente*
A%ui -emos (uelto a llamar a la funcion llenarBodos pero a-ora le en(iamos como parametro a sus nodos -i"os* En
caso de %ue estos sean -o"as se retornara su (alor almacenado#se sumaran & se guardara en la rai'* i esto no es cierto
se seguiran -aciendo llamadas a la misma funcion -asta encontrar un nodo -o"a*
int llenarBodos:ree arbol4
if:nodereeIseaf:arbol44
return integerDet:nodereeDetalue:arbol44KPP(alue es un generico por eso debe etraerse el entero
%ue almacena
Lelse
int sumallenarBodos:nodereeDeteft:arbol44 M llenarBodos:nodereeDeteft:arbol44K
nodereeetalue :arbol # integerBeQ:suma44Kreturn sumaK
L
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
18/27
@itter mantiene por cada usuario una lista con sus mensa;es ordenados en forma cronológica* del más reciente al
más antiguo. )i un usuario quiere seguir a otro En otro -eap# &a %ue eso es lo %ue sugiere el
problema# este ultimo -eap es el %ue (amos a retornar*
Código!
HeapNobtenerRensa"e:istNeguidosST#int n4
istNlistaK
int acumular0#i#"K
Heap Nordenar#Nmensa"esK BodeistNpK
for:i0KinKiMM4
listaeguidosSiTK
if:listDeti'e:lista4=104
acumularacumularM10K
Lelse
acumularacumularMlistDeti'e:lista4K
L
L
ordenar-eapBeQ:acumular#!E/#time/mp4K
mensa"es-eapBeQ:10#!E/#time/mp4K
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
19/27
for:i0KinKiMM4
listaeguidosSiTK
for:plistDetHeader:lista4KpBUKpnodeistDetBet:p44
if:"104
-eapEnVueue:ordenar#nodeistDet/ont:p44K
"MMK
Lelse breaFK
L
L
L
for:i0Ki10KiMM4
-eapEnVueue:mensa"es#-eap!eVueue:ordenar44K
L
return mensa"esK
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
20/27
%n quad-tree es un @'A que se usa en informática gráfica para representar figuras planas en blanco y negro. "s un
árbol en cual los nodos 0o;a pueden representar un blanco o un negro y los nodos internos no representan ning7n
color* pero siempre tienen eactamente 2 0i;os. Asumiendo que la figura esta en un plano* el árbol se construye a
partir de la figura con los siguientes pasos!
1.- 'i+idir el plano en 2 cuadrantes.
&.- e+isar cada cuadrante en el sentido del relo;!
- )i el cuadrante esta lleno de blancos* corresponde a una 0o;a blanca en el árbol.
- )i el cuadrante esta lleno de negros* corresponde a una 0o;a negra en el árbol.
- )i el cuadrante esta parcialmente blanco y negro corresponde a un nodo interno. Aplicar el mismo algoritmo pero
para un plano que equi+alga al cuadrante que se esta re+isando.
"l tipo de Figura puede ser una matri de @ o F de dimensiones & & *donde es la altura del quad-tree menos uno.
";emplo!
Figura
>uad-@ree que representa la figura
a'efinir la estructura para representar un quad-tree
b#mplemente una función que determine la altura del quad-tree.
c#mplemente un procedimiento que dada una figura genere el correspondiente quad-tree.
d#mplemente un procedimiento que dado un quad-tree genere la figura correspondiente.
)olución!
a4 amos a -acer un repaso de todas las caracter)sticas rele(antes %ue describen a un Vuad6tree* En este tipo de $rboltenemos %ue los nodos -o"as pueden tener asociados un color :Clanco o Begro4 & en cambio los nodos internos no
tienen ning9n color en particular* Ademas un nodo puede tener cero -i"os :nodos -o"as4 o eactamente cuatro -i"os
:nodos internos4*
amos a definir una enumeraci,n /olor %ue puede ser CAB/O#BED.O# o BIBDUBO* Un nodo posee un /olor en
particular & un con"unto de -i"os %ue a su (e' son nodos tambin* Obser(e la definici,n recursi(a t)pica en los arboles*
ara saber si un nodo es -o"a o es interno basta con saber el tipo de color %ue posee* Este nodo %ue acabamos de
describir sera el !A Vuad6tree*
b4 A-ora (amos a detallar como encontraremos la altura de este nue(o tipo de $rbol* a altura de un $rbol es el
numero de nodos %ue eiste desde la ra)' -asta la -o"a mas profunda del $rbol*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
21/27
Usaremos una (e' mas la recursion# di(idiremos el problema en subproblemas del mismo tipo pero con menor
tama+o# resol(eremos estos subproblemas & combinaremos esas soluciones para encontrar la soluci,n final al
problema original*
ara encontrar la altura de un $rbol con n -i"os lo %ue -aremos es encontrar la m$ima altura entre todos los n6
subarboles & sumarle el nodo ra)'* ara encontrar la altura de un subarbol se -ar$ eactamente lo mismo & as)
sucesi(amente*
upongamos %ue tenemos un %uad6tree %ue llamaremos V de altura -* V tiene cuatro -i"os % 1#%2#%3#%? %ue son a su(e' %uad6trees*
!efinamos tambin la funci,n maimo:-1#-2#-3#-?4 %ue recibe cuatro enteros positi(os & retorna el ma&or entre ellos*
odos estaremos de acuerdo si decimos %ue -altura:V4 1M maimo:altura:%1 4#altura:%2 4altura:%3 4#altura:%? 44
Obser(e %ue se reali'an (arias llamadas recursi(as# cuando estas retornen con sus respecti(os resultados & la funci,n
maimo -aga su traba"o# obtendremos la altura de V*
amos a bos%ue"ar como se reali'an estas llamadas* rimero se necesita saber el (alor de altura:% 1 4* Bote %ue %1 es
tambin un %uad6tree# asumamos %ue es un nodo interno & %ue tiene como -i"os a % 11#%12#%13#%1? entonces tambin
podemos afirmar %ue altura:%14 1M maimo:altura:%114#altura:%124#altura:%134#altura:%1?44 *
abemos bien %ue %11 es un %uad6tree# a-ora supongamos %ue es un nodo -o"a# la altura de un $rbol %ue posee un
solo nodo es uno# es a%u) donde -abremos definido nuestro caso base# %ue es necesario para el fin de la recursion*
El estado de nuestra epresi,n una (e' %ue se conocio el (alor de la altura de % 11 seria
altura:%14 1M maimo: 1 #altura:%124#altura:%134#altura:%1?44 *
A-ora se necesita saber la altura de %12 & asi sucesi(amente para los -i"os restantes*
uego de %ue se -a&an calculado las respecti(as alturas nuestra epresion seria
altura:%14 1M maimo: 1 #i # "# F4 # donde i#"#F representan la altura de los %uad6tree -i"os en cuesti,n# no entraremos
en detalle de como se calculan puesto %ue es el mismo proceso %ue &a -emos descrito si son -o"as su altura es uno
sino sera 1M altura maima entre sus %uad6tree -i"os*
A-ora la funci,n maimo &a puede -acer su traba"o & encontrara el ma&or (alor entre 1#i#"#F* uego se sumara este
resultado con uno & -abremos encontrado la altura de %1*
uego se necesita saber el (alor de altura:% 24# & como &a -emos dic-o este proceso sera igual al %ue usamos para
encontrar la altura de %1 & asi sucesi(amente para los %uad6tree -i"os restantes# luego de obtener esos resultadosparciales# la funci,n maimo -ace su tarea# se suma uno al resultado & obtenemos la altura de V*
Es importante %ue usted pruebe este algoritmo con el %uad6tree de prueba %ue nos presenta el problema# o con
cual%uier otro $rbol en particular# para %ue se pueda transparentar & entender de me"or manera como funciona la
recursion*
c4 ara contestar el resto de literales (amos a presentar dos !AWs adicionales %ue nos ser$n de gran a&uda*
!A oint %ue representa un par de enteros inicial & final*
!A !imension %ue posee dos instancias del !A oint fila & columna* Este tipo de dato nos ser(ir$ para almacenar la
informaci,n de un cuadrante# es decir los indices iniciales & finales de las filas & las columnas*
a parte cla(e para resol(er este problema es entender como se (a ir formando el %uad6tree a partir de la imagen# lo
detallaremos a continuaci,n
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
22/27
rimero supongamos %ue tenemos la siguiente figura
Es mu& similar a la del e"emplo solo con la diferencia de %ue esta figura es una matri' de Clancos & Begros de 2 F2F
donde F es cual%uier entero positi(o*
A-ora el proceso de di(isi,n de la matri' en cuatro cuadrantes (a mas o menos as)
/uadrante uno filaXinicial0#filaXfinal2F61K columnaXinicial0 columnaXfinal 2F61
/uadrante dos filaXinicial0#filaXfinal2F61K columnaXinicial2F61 M1 columnaXfinal 2F
/uadrante tres filaXinicial2F61M1# filaXfinal2FK columnaXinicial2F61 M1 columnaXfinal 2F
/uadrante cuatro filaXinicial2F61M1# filaXfinal2F K columnaXinicial0 columnaXfinal 2F61
/ada uno de estos cuadrantes ser$n anali'ados con el siguiente criterio si el cuadrante esta lleno de blancos se creara
una -o"a dentro del %uad6tree con color CAB/O# si el cuadrante esta lleno de negros se creara una -o"a dentro del%uad6tree con color BED.O# si el cuadrante tiene combinaci,n de blancos & negros entonces se crear un %uad6tree con
color BIBDUBO %ue tendr$ eactamente cuatro -i"os# & es a%u) en donde se (uel(e a di(idir la figura# en este caso el
cuadrante en an$lisis es di(ido en cuatro planos de dimensiones de 2F622F62 cada uno# as) sucesi(amente* Obser(e %ue
las di(isiones pararan cuando encontremos planos totalmente blancos o negros & tambin cuando tengamos planos de
2020*
/omo conclusi,n los problemas a resol(er a%u) son conocer como ir di(idiendo los cuadrantes sucesi(amente & como
determinar el tipo de cuadrante %ue esta en an$lisis*
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
23/27
Hablemos mas en detalle
amos a implementar el procedimiento (oid generarVuadree:/olor NNfigura# VuadreeNarbol# int filasXini# int colXini#
int filasXma# int colXma4 %ue recibe una matri' %ue es la representaci,n de la figura# recibimos tambin la ra)' del
%uad6tree & cuatro enteros %ue nos indica los rangos de las filas & las columnas de la matri'* En un principio las filas (an
de 0 a 2F & las columnas de 0 a 2F * !onde F es un entero positi(o cual%uiera como &a lo -emos dic-o*
amos a definir los cuadrantes como un con"unto de cuatro instancias del !A !imension# recapitulando cada
dimensi,n almacena cuatro elementos importantes los indices fila inicial#fila final# columna inicial & columna final*Antes de seguir eplicando el procedimiento generarVuadree primero eplicaremos el funcionamiento de otras
funciones %ue usaremos para resol(er el problema de forma mas sencilla*
a funci,n (oid asignar!imensiones:!imensionNcuadrantesST# int filasXini# int colXini# int filasXma# int colXma4 tiene
como ob"eti(o llenar el arreglo cuadrantes con las dimensiones correspondientes# es decir se encargara de Ydi(idirZ la
figura en cuatro partes seg9n el caso# tome muc-a atenci,n a la implementaci,n %ue se presenta a%u)*
a funci,n /olor tipo/uadrante:/olor NNfigura# !imension Ncuadrante4 es la encargada de re(isar la matri' figura
entre las dimensiones especificadas en la (ariable cuadrante* .ecuerde %ue un cuadrante puede estar lleno de
blancos#negros o una combinaci,n entre esos dos colores* Obser(e %ue la (ariable cuadrante almacena solo los indices
%ue necesitamos para anali'ar la matri' de Clancos & Begros# es decir por e"emplo si recibimos la figura %ue acabamos
de mostrar & recibimos el cuadrante dos# entonces se anali'ara la imagen entre las filas 0 -asta 2F & entre las columnas
2F61M1 -asta 2F*
ol(amos al procedimiento generarVuadree .ecibimos la ra)' del $rbol# %ue sera un nodo de color BIBDUBO & con
cuatro nodos -i"os %ue no sabemos de %ue tipo ser$n &a %ue eso depender$ de la figura* El con"unto de cuadrantes
sera un arreglo de dimensiones %ue se iniciali'ara con la funci,n asignar!imensiones %ue mencionamos
anteriormente*
uego se ira iterando el con"unto de %uad6tree -i"os para determinar# en funci,n de la imagen & el cuadrante
correspondiente# %ue tipo de nodo es* amos a determinar el tipo de cuadrante con la funci,n tipo/uadrante %ue
describimos anteriormente*
e empie'a con el primer cuadrante & el primer -i"o del %uad6tree* i la funci,n tipo/uadrante retorna
6 CAB/O el primer -i"o sera de color CAB/O & se iniciali'a con cero -i"os*
6 BED.O el primer -i"o sera de color BED.O & se iniciali'a con cero -i"os*6 BIBDUBO el primer -i"o sera de color BIBDUBO & se iniciali'a con cuatro -i"os* A-ora se necesita di(idir el primer
cuadrante & conocer el tipo de nodos correspondientes a los -i"os del primer -i"o* ara eso se (ol(er$ a llamar a la
funci,n generarVuadree# pero en cambio la ra)' a-ora sera el primer -i"o# se en(iara la misma figura# pero las
dimensiones de an$lisis cambiaran# estos datos los almacena el primer cuadrante* Obser(e %ue este tambin es un
proceso recursi(o* /uando se -a&a completado de construir este sub6%uad6tree se podr$ seguir iterando con el
segundo -i"o & el segundo cuadrante# luego el tercer -i"o & el tercer cuadrante# despus el cuarto -i"o & cuarto
cuadrante# con esto terminamos de construir el $rbol original*
Bue(amente# se anima a %ue se realice una prueba de escritorio con el algoritmo %ue -emos descrito para %ue se
pueda entender en su totalidad*
El ultimo procedimiento %ue nos piden implementar es (oid generarigura:/olorNNfigura# VuadreeNarbol# int
filasXini#int filasXma# int colXini#int colXma4 %ue recibe una matri' (ac)a# las dimensiones de la matri' & la ra)' de un%uad6tree %ue representa a una figura*
Haremos un proceso mu& similar al de la funci,n anterior* endremos un con"unto de cuadrantes %ue se formaran de
las misma forma %ue &a se eplico* amos a iterar los -i"os del nodo ra)' %ue recibimos por par$metro & el con"unto de
cuadrantes*
e empie'a con el primer -i"o & con el primer cuadrante* i el primer -i"o es de color
6CAB/O el primer -i"o representa un cuadrante lleno de blancos En este caso el primero*
uego# llenamos la figura con el color CAB/O entre las dimensiones definidas en el cuadrante*
6BED.O el primer -i"o representa un cuadrante lleno de negros En este caso el primero*
uego# llenamos la figura con el color BED.O entre las dimensiones definidas en el cuadrante*
6BIBDUBO significa %ue el primer -i"o representa un cuadrante lleno de blancos & negros* Esto %uiere decir %ue se
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
24/27
necesita anali'ar este cuadrante & los -i"os del primer -i"o* o %ue -aremos es (ol(er a llamar a la funci,n
generarigura# en(i$ndole las nue(as dimensiones de an$lisis :las del primer cuadrante4* uego de resol(er este
subproblema seguimos anali'ando el segundo -i"o & el segundo cuadrante# despus el tercer -i"o & el tercer cuadrante#
& por ultimo el cuarto -i"o & el cuarto cuadrante* Obser(e %ue en cada an$lisis se pueden reali'ar (arias llamadas
recursi(as* Bue(amente se aconse"a %ue realice una prueba siguiendo cada paso de la soluci,n# es la 9nica forma de
terminar de entender por completo como funciona la recursion*
resentamos un pe%ue+o programa para probar los procedimientos %ue -emos dise+ado* rimero se genera la figuradel e"emplo %ue nos muestra la descripci,n# en base a ella construimos un %uad6tree* ambin se calcula la altura del
%uad6tree & se muestra por pantalla* uego se declara una matri' de colores de 2 F2F donde F es el ni(el del %uadtree
%ue es calculado restando la altura del $rbol con uno* e iniciali'a la matri' con el color BIBDUBO* Esta figura sera
llenada en funci,n del $rbol %ue generamos anteriormente*
Código!
t&pedef enum /olor
BED.O# CAB/O# BIBDUBO
L /olorK
t&pedef struct Vuadree
/olor colorK
struct Vuadree NN-i"osK
L VuadreeK
t&pedef struct
int inicial# finalK
L ointK
t&pedef struct
oint Nfila# NcolumnaKL !imensionK
VuadreeN%uadreeBeQ:/olor color4
Vuadree Narbol malloc:si'eof :Vuadree44K
arbol6=color colorK
if :color BIBDUBO4
arbol6=-i"os malloc:si'eof :VuadreeN4N?4K
L else
arbol6=-i"os BUK
L
return arbolKL
!imensionNdimensionBeQ:ointNfila# ointNcolumna4
!imensionNdimension malloc:si'eof :!imension44K
dimension6=fila filaK
dimension6=columna columnaK
return dimensionK
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
25/27
oint NpointBeQ:int inicial# int final4
ointNp malloc:si'eof :oint44K
p6=inicial inicialK
p6=final finalK
return pK
L
/olorNNfiguraBeQ:int dimension# /olor color4 PPgenera una matri' de colores de dimensiondimension
int i# "K
/olorNNfiguraK
figura malloc:si'eof :/olorN4 N dimension4K
for :i 0K i dimensionK iMM4
figuraSiT malloc:si'eof :/olor4 N dimension4K
L
for :i 0K i dimensionK iMM4
for :" 0K " dimensionK "MM4
figuraSiTS"T colorK
L
L
return figuraK
L
int alturaVuadree:Vuadree Narbol4
if :arbol6=color CAB/O [[ arbol6=color BED.O4
return 1K
L else
return 1 M maimo:alturaVuadree:arbol6=-i"osS0T4# alturaVuadree:arbol6=-i"osS1T4#
alturaVuadree:arbol6=-i"osS2T4# alturaVuadree:arbol6=-i"osS3T44K L
L
int maimo:int Q# int # int int '4
int ma# i# arra&S?TK
arra&S0T QK
arra&S1T K
arra&S2T &K
arra&S3T 'K
ma arra&S0TK
for :i 1K i ?K iMM4
if :ma arra&SiT4
ma arra&SiTK
L
L
return maK
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
26/27
(oid asignar!imensiones:!imensionNcuadrantesST# int filasXini# int colXini# int filasXma# int colXma4
cuadrantesS0T dimensionBeQ:pointBeQ:filasXini# filasXini M :filasXma 6 filasXini4 P 24#
pointBeQ:colXini# colXini M :colXma 6 colXini4 P 244K
cuadrantesS1T dimensionBeQ:pointBeQ:filasXini# filasXini M :filasXma 6 filasXini4 P 24#
pointBeQ:colXini M :colXma 6 colXini4 P 2 M 1# colXma44K cuadrantesS2T dimensionBeQ:pointBeQ:filasXini M :filasXma 6 filasXini4 P 2 M 1# filasXma4#
pointBeQ:colXini M :colXma 6 colXini4 P 2 M 1# colXma44K
cuadrantesS3T dimensionBeQ:pointBeQ:filasXini M :filasXma 6 filasXini4 P 2 M 1# filasXma4#
pointBeQ:colXini# colXini M :colXma 6 colXini4 P 244K
L
/olor tipo/uadrante:/olor NNimagen# !imension Ndimension4
ointNfila# NcolumnaK
fila dimension6=filaK
columna dimension6=columnaK
int i# "K
/olor colorK
int flagK
for :i fila6=inicialK i fila6=finalK iMM4
for :" columna6=inicialK " columna6=finalK "MM4
color imagenSi 6 1TS" 6 1TK
sQitc- :color4
case CAB/O
if :flag 14
return BIBDUBOK
L flag 0K
breaFK
case BED.O
if :flag 04
return BIBDUBOK
L
flag 1K
breaFK
L
L
L
if :flag4
return BED.OK
L else
return CAB/OK
L
L
.odrigo /astro .e&es
acultad de Ingenier)a Elctrica & /omputaci,n
8/18/2019 Ejercicios_Resueltos_Arboles
27/27
(oid generarVuadree:/olor NNfigura# VuadreeNarbol# int filasXini# int colXini# int filasXma# int colXma4
int iK
!imension N cuadrantesS?TK
asignar!imensiones:cuadrantes# filasXini# colXini# filasXma# colXma4K
for :i 0K i ?K iMM4 sQitc- :tipo/uadrante:figura# cuadrantesSiT44
case CAB/O
arbol6=-i"osSiT %uadreeBeQ:CAB/O4K
breaFK
case BED.O
arbol6=-i"osSiT %uadreeBeQ:BED.O4K
breaFK
case BIBDUBO
arbol6=-i"osSiT %uadreeBeQ:BIBDUBO4K
generarVuadree:figura# arbol6=-i"osSiT# cuadrantesSiT6=fila6=inicial# cuadrantesSiT6=columna6=inicial#
cuadrantesSiT6=fila6=final# cuadrantesSiT6=columna6=final4K
breaFK
L
L
L
(oid generarigura:/olorNNfigura# VuadreeNarbol# int filasXini# int filasXma# int colXini# int colXma4
int i# "# FK
Vuadree N-i"oK
!imensionNdimK ointNfila# NcolumnaK
!imension N cuadrantesS?TK
asignar!imensiones:cuadrantes# filasXini# filasXma# colXini# colXma4K
for :i 0K i ?K iMM4
-i"o arbol6=-i"osSiTK
dim cuadrantesSiTK
fila dim6=filaK
columna dim6=columnaK
if :-i"o6=color BIBDUBO4 for :" fila6=inicialK " fila6=finalK "MM4
for :F columna6=inicialK F columna6=finalK FMM4
figuraS"61TSF61T -i"o6=colorK
L
L
L else
generarigura:figura# -i"o# fila6=inicial# columna6=inicial# fila6=final# columna6=final4K
L
L
L
.odrigo /astro .e&es