<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Estructura de datos &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/estructura-de-datos/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Thu, 27 Aug 2020 03:55:12 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.15</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>Estructura de datos &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Estructura de datos &#8211; Árboles</title>
		<link>https://www.oscarblancarteblog.com/2014/08/22/estructura-de-datos-arboles/</link>
					<comments>https://www.oscarblancarteblog.com/2014/08/22/estructura-de-datos-arboles/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 22 Aug 2014 21:32:43 +0000</pubDate>
				<category><![CDATA[Estructuras de Datos]]></category>
		<category><![CDATA[Arboles]]></category>
		<category><![CDATA[Estructura de datos]]></category>
		<guid isPermaLink="false">http://oscarblancarteblog.com/?p=311</guid>

					<description><![CDATA[<p>Los Árboles son las estructuras de datos mas utilizadas, pero también una de las mas complejas, Los Árboles se caracterizan por almacenar sus nodos en forma jerárquica y no en forma lineal como las Listas Ligadas, Colas,Pilas,etc., de las cuales ya hemos hablado en días pasados.   Datos importantes de los Árboles Para comprender mejor [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/08/22/estructura-de-datos-arboles/">Estructura de datos &#8211; Árboles</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" width="933" height="524" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/arboles-estructura-de-datos-banner.jpg" alt="Árboles estructuras de datos" class="wp-image-3255" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/arboles-estructura-de-datos-banner.jpg 933w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/arboles-estructura-de-datos-banner-300x168.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/arboles-estructura-de-datos-banner-768x431.jpg 768w" sizes="(max-width: 933px) 100vw, 933px" /></figure>


<p style="text-align: justify;">Los Árboles son las estructuras de datos mas utilizadas, pero también una de las mas complejas, Los Árboles se caracterizan por almacenar sus nodos en forma jerárquica y no en forma lineal como las <a title="Estructuras de datos – Listas ligadas" href="http://oscarblancarteblog.com/2014/07/24/estructuras-de-datos-listas-ligadas/">Listas Ligadas</a>, <a title="Estructura de datos – Queue (Cola)" href="http://oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/">Colas</a>,<a title="Estructura de datos – Pila (Stack)" href="http://oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/">Pilas</a>,etc., de las cuales ya hemos hablado en días pasados.<span id="more-311"></span></p>
<figure id="attachment_310" aria-describedby="caption-attachment-310" style="width: 606px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolvslineal.png"><img loading="lazy" class="wp-image-310" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolvslineal.png" alt="árboles" width="606" height="568" /></a><figcaption id="caption-attachment-310" class="wp-caption-text">Fig. 1: La imagen muestra la diferencia entra las estructuras de datos lineas y las no lineales como lo son los Árboles.</figcaption></figure>
<p> </p>
<h1 style="text-align: justify;">Datos importantes de los Árboles</h1>
<p style="text-align: justify;">Para comprender mejor que es un árbol comenzaremos explicando como está estructurado.</p>
<p style="text-align: justify;"><strong>Nodos: </strong>Se le llama Nodo a cada elemento que contiene un Árbol.</p>
<p style="text-align: justify;"><strong>Nodo Raíz: </strong>Se refiere al primer nodo de un Árbol, Solo un nodo del Árbol puede ser la Raíz.</p>
<p style="text-align: justify;"><strong>Nodo Padre: </strong>Se utiliza este termino para llamar a todos aquellos nodos que tiene al menos un hijo.</p>
<p style="text-align: justify;"><strong>Nodo Hijo:</strong> Los hijos son todos aquellos nodos que tiene un padre.</p>
<p style="text-align: justify;"><strong>Nodo Hermano: </strong>Los nodos hermanos son aquellos nodos que comparte a un mismo padre en común dentro de la estructura.</p>
<p style="text-align: justify;"><strong>Nodo Hoja: </strong>Son todos aquellos nodos que no tienen hijos, los cuales siempre se encuentran en los extremos de la estructura.</p>
<p style="text-align: justify;"><strong>Nodo Rama:</strong> Estos son todos aquellos nodos que no son la raíz  y que ademas tiene al menos un hijo.</p>
<p> </p>
<figure id="attachment_312" aria-describedby="caption-attachment-312" style="width: 561px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/tiposdenodos.png"><img loading="lazy" class="wp-image-312" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/tiposdenodos.png" alt="árboles" width="561" height="352" /></a><figcaption id="caption-attachment-312" class="wp-caption-text">Fig. 2: La imagen muestra de forma gráfica cuales son los nodos Raíz, Rama, Hoja.</figcaption></figure>
<figure id="attachment_314" aria-describedby="caption-attachment-314" style="width: 567px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/nodospadrehijohermano.png"><img loading="lazy" class="wp-image-314" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/nodospadrehijohermano.png" alt="árboles" width="567" height="195" /></a><figcaption id="caption-attachment-314" class="wp-caption-text">Fig.3: La siguiente imagen muestra de forma gráfica los nodos Padre, Hijo y Hermanos</figcaption></figure>
<p style="text-align: justify;">Los arboles a demas de los nodos tiene otras propiedades importantes que son utilizadas en diferente ámbitos los cuales son:</p>
<p style="text-align: justify;"><strong>Nivel:</strong> Nos referimos como nivel a cada generación dentro del árbol. Por ejemplo, cuando a un nodo hoja le agregamos un hijo, el nodo hoja pasa a ser un nodo rama pero a demas el árbol crece una generación por lo que el Árbol tiene un nivel mas.Cada generación tiene un número de Nivel distinto que las demas generaciones.</p>
<ul style="text-align: justify;">
<li>Un árbol vacío tiene 0 niveles</li>
<li>El nivel de la Raíz es 1</li>
<li>El nivel de cada nodo se calculado contando cuantos nodos existen sobre el, hasta llegar a la raíz + 1, y de forma inversa también se podría, contar cuantos nodos existes desde la raíz hasta el nodo buscado + 1.</li>
</ul>
<p style="text-align: justify;"><strong>Altura: </strong>Le llamamos Altura al número máximo de niveles de un Árbol.</p>
<figure id="attachment_317" aria-describedby="caption-attachment-317" style="width: 565px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/alturaniveles.png"><img loading="lazy" class="wp-image-317" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/alturaniveles.png" alt="árboles" width="565" height="409" /></a><figcaption id="caption-attachment-317" class="wp-caption-text">Fig. 4: En la imagen se muestran los Niveles y la Altura de un Árbol.</figcaption></figure>
<p style="text-align: justify;">La <strong>altura</strong> es calculado mediante recursividad tomando el nivel mas grande de los dos sub-árboles de forma recursiva de la siguiente manera:</p>
<p style="text-align: justify;">altura = max(altura(hijo1), altura(hijo2),altura(hijoN)) + 1</p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"><strong>Peso:</strong> Conocemos como peso a el número de nodos que tiene un Árbol. Este factor es importante por que nos da una idea del tamaño del árbol y el tamaño en memoria que nos puede ocupar en tiempo de ejecución(Complejidad Espacial en análisis de algoritmos.)</p>
<figure id="attachment_318" aria-describedby="caption-attachment-318" style="width: 507px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/peso.png"><img loading="lazy" class="wp-image-318 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/peso.png" alt="árboles" width="507" height="338" /></a><figcaption id="caption-attachment-318" class="wp-caption-text">Fig. 5: La imagen nos muestra como se calcula el peso de un Árbol, el cual es la suma de todos sus nodos, sin importar el orden en que sean contados.</figcaption></figure>
<p style="text-align: justify;">El peso se puede calcular mediante cualquier tipo de recorrido el cual valla contando los nodo a medida que avanza sobre la estructura. El peso es un árbol es igual a la suma del peso de los sub-árboles hijos + 1</p>
<p style="text-align: justify;">peso = peso(hijo1) + peso(hijo2) + peso(hijoN)+ 1</p>
<p style="text-align: justify;"><em>Nota: Los tipos de recorridos los veremos mas adelante.</em></p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"><strong>Orden: </strong>El Orden de un árbol es el número máximo de hijos que puede tener un Nodo.</p>
<figure id="attachment_321" aria-describedby="caption-attachment-321" style="width: 537px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/orden.png"><img loading="lazy" class="wp-image-321 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/orden.png" alt="árboles" width="537" height="277" /></a><figcaption id="caption-attachment-321" class="wp-caption-text">Fig. 6: Imagen que nuestra dos Árboles con Orden = 2(Izquierda) y un segundo con Orden = 3(Derecha).</figcaption></figure>
<p style="text-align: justify;">Notemos que un Árbol con Orden = 1 no tendría sentido ya que seria una estructura lineal. ya que cada nodo solo podría tener un Hijo y tendríamos un Árbol como la Imagen de la Fig.1.</p>
<p style="text-align: justify;">Este valor no lo calculamos, si no que ya lo debemos conocer cuando diseñamos nuestra estructura, ya que si queremos calcular esto lo que obtendremos es el <strong>grado</strong>(hablamos de el continuación).</p>
<p style="text-align: justify;"><strong>Grado: </strong>El grado se refiere al número mayor de hijos que tiene alguno de los nodos del Árbol y esta limitado por el Orden, ya que este indica el número máximo de hijos que puede tener un nodo.</p>
<figure id="attachment_323" aria-describedby="caption-attachment-323" style="width: 536px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/grado.png"><img loading="lazy" class="wp-image-323 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/grado.png" alt="árboles" width="536" height="329" /></a><figcaption id="caption-attachment-323" class="wp-caption-text">Fig. 7: En la imagen podemos apreciar un Árbol con grado 2(Izquierda) y un otro con grado 3(Derecha).</figcaption></figure>
<p style="text-align: justify;">El grado se calcula contando de forma recursiva el número de hijos de cada sub-árbol hijo y el numero de hijos del nodo actual para tomar el mayor, esta operación se hace de forma recursiva para recorrer todo el árbol.</p>
<p style="text-align: justify;">grado = max(contarHijos(hijo1),contarHijos(hijo2), contarHijos(hijoN), contarHijos(this))</p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"><strong>Sub-Árbol:</strong> Conocemos como Sub-Árbol a todo Árbol generado a partir de una sección determinada del Árbol, Por lo que podemos decir que un Árbol es un nodo Raíz con N Sub-Árboles.</p>
<figure id="attachment_326" aria-describedby="caption-attachment-326" style="width: 577px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/subarbol.png"><img loading="lazy" class="wp-image-326 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/subarbol.png" alt="árboles" width="577" height="456" /></a><figcaption id="caption-attachment-326" class="wp-caption-text">Fig. 8: En la imagen de puede apreciar que un Árbol esta compuesto por una seria de Sub-Arboles los cual conforman toda la estructura.</figcaption></figure>
<p style="text-align: justify;">Existen escenarios donde podemos sacar un Sub-Árboles del Árbol para procesarlo de forma separada, de esta forma el Sub-Árboles pasa a ser un Árbol independiente, También podemos eliminar Sub-Árboles completos, Agregarlos,entre otras operaciones.</p>
<h1> </h1>
<h2 style="text-align: justify;">Árbol n-ario</h2>
<p style="text-align: justify;">los arboles <strong>n-arios </strong>son aquellos arboles donde el <strong>número máximo de hijos por nodo</strong> es de <strong>N</strong>, en la figura 7 podemos apreciar dos árboles con grado 2 y grado 3, estos dos arboles también los podemos definir como Árbol n-ario con n = 2 y n=3 respectivamente.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Árboles binarios</h2>
<p style="text-align: justify;">Esta estructura se caracteriza por que cada nodo solo puede tener máximo 2 hijo, dicho de otra manera es un Árbol n-ario de Grado 2.</p>
<figure id="attachment_328" aria-describedby="caption-attachment-328" style="width: 222px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolbinario.png"><img loading="lazy" class="wp-image-328 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolbinario.png" alt="árboles" width="222" height="221" /></a><figcaption id="caption-attachment-328" class="wp-caption-text">Fig. 9: En la imagen podemos apreciar un Árbol Binario.</figcaption></figure>
<p style="text-align: justify;"><strong>Árbol binario lleno: </strong>Es aquel que el que todos los nodos tiene cero o 2 hijos con excepción de la Raíz.</p>
<figure id="attachment_330" aria-describedby="caption-attachment-330" style="width: 440px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolbinariolleno.png"><img loading="lazy" class="wp-image-330 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolbinariolleno.png" alt="árboles" width="440" height="218" /></a><figcaption id="caption-attachment-330" class="wp-caption-text">Fig. 10: Podemos apreciar que el árbol de la derecha no esta lleno ya que uno de sus nodos no cumple con la condición cero o 2 hijos. ya que el nodo C solo tiene un hijo.</figcaption></figure>
<p style="text-align: justify;"><strong>Árbol binario perfecto:</strong> Es un Árbol lleno en donde todos las Hojas están en el mismo <strong>Nivel.</strong></p>
<figure id="attachment_333" aria-describedby="caption-attachment-333" style="width: 606px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolbinarioperfecto1.png"><img loading="lazy" class="wp-image-333 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/arbolbinarioperfecto1.png" alt="árboles" width="606" height="282" /></a><figcaption id="caption-attachment-333" class="wp-caption-text">Fig. 11: En la imagen podemos apreciar que el árbol de la izquierda tiene todas sus hojas al mismo nivel y que ademas esta lleno, lo que lo convierte en un árbol binario perfecto. Sin embargo, del lado derecho podemos ver que aunque el árbol esta lleno no tiene todas las hojas al mismo nivel lo que hace que no sea un árbol binario perfecto pero si lleno.</figcaption></figure>
<p style="text-align: justify;"> </p>
<hr />
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Recorrido sobre Árboles</h1>
<p style="text-align: justify;">Los recorridos son algoritmos que nos permiten recorrer un árbol en un orden especifico, los recorridos nos pueden ayudar encontrar un nodo en el árbol, o buscar una posición determinada para insertar o eliminar un nodo.</p>
<p style="text-align: justify;">Básicamente podemos catalogar las búsqueda en dos tipos, las búsqueda en profundidad y las búsquedas en amplitud.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Búsquedas no informadas</h2>
<p style="text-align: justify;">Las búsquedas no informadas son aquellas en que se realiza el viaje por todo el árbol sin tener una pista de donde pueda estar el dato deseado. Este tipo de búsquedas también se conocen como búsquedas a ciegas.</p>
<p style="text-align: justify;">Para comprender mejor que es una búsqueda no informada expondremos el siguiente ejemplo:</p>
<p style="text-align: justify;">Imagine que vamos por la carretera y de repente encontramos dos caminos, el problema a qui es que uno después de 50 kilómetros esta en construcción y el otro nos lleva a nuestro destino, sin embargo ninguno de los caminos tiene señalamiento. Lo que tendríamos que hacer es recorrer el primero camino y después de 50 kilómetros encontrarnos con que el camino esta en construcción, entonces tendríamos que regresar para irnos por el segundo camino,el cual nos lleva a nuestro destino(Para esto ya recorrimos los 50 kilómetros de ida y los 50 kilómetros de regreso lo que nos da 100 kilómetros mas a nuestra ruta).</p>
<p style="text-align: justify;">A este tipo de escenarios en los cuales las búsquedas de hacen a ciegas los conocemos como búsquedas no informadas.</p>
<p style="text-align: justify;">Las siguientes métodos de búsqueda que veremos a continuación(Búsqueda en profundad y Búsqueda en amplitud) pertenecen a  las búsquedas no informadas.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Búsqueda en profundidad</h2>
<p style="text-align: justify;"><strong>Recorrido Pre-orden: </strong>El recorrido inicia en la Raíz y luego se recorre en pre-orden cada unos de los sub-árboles de izquierda a derecha.</p>
<p style="text-align: justify;">Esta definición puede ser un poco compleja de entender por lo que mejor les dejo la siguiente imagen.</p>
<figure id="attachment_338" aria-describedby="caption-attachment-338" style="width: 581px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/preorden.png"><img loading="lazy" class="wp-image-338 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/preorden.png" alt="árboles" width="581" height="392" /></a><figcaption id="caption-attachment-338" class="wp-caption-text">Fig. 12:En la imagen podemos ver el orden en que es recorrido el árbol iniciando desde la Raíz.</figcaption></figure>
<p style="text-align: justify;"> </p>
<figure id="attachment_357" aria-describedby="caption-attachment-357" style="width: 387px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/preordencode.png"><img loading="lazy" class="wp-image-357 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/preordencode.png" alt="árboles" width="387" height="125" /></a><figcaption id="caption-attachment-357" class="wp-caption-text">Fig. 13: Codigo de una función recursiva que recorre un árbol en preorden.</figcaption></figure>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"><strong>Recorrido Pos-orden: </strong>Se recorre el pos-orden cada uno de los sub-árboles y al final se recorre la raíz.</p>
<p style="text-align: justify;">Para comprender mejor esta definición observemos la siguiente imagen:</p>
<figure id="attachment_341" aria-describedby="caption-attachment-341" style="width: 584px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/postorden.png"><img loading="lazy" class="wp-image-341 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/postorden.png" alt="árboles" width="584" height="407" /></a><figcaption id="caption-attachment-341" class="wp-caption-text">Fig. 14: En la imagen podemos observar como se realiza el recorrido en Pos-Orden, Sin embargo es importante notar que el primer nodo que se imprime no es la Raiz pues en este recorrido la Raíz de cada Sub-Árbol es procesado al final, ya que toda su descendencia ha sido procesada.</figcaption></figure>
<figure id="attachment_358" aria-describedby="caption-attachment-358" style="width: 385px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/posordencode.png"><img loading="lazy" class="wp-image-358 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/posordencode.png" alt="árboles" width="385" height="131" /></a><figcaption id="caption-attachment-358" class="wp-caption-text">Fig. 15: Código de una función recursiva que recorre un árbol en posorden</figcaption></figure>
<p style="text-align: justify;"><strong>Recorrido in-orden: </strong>Se recorre en in-orden el primer sub-árbol, luego se recorre la raíz y al final se recorre en in-orden los demas sub-árboles</p>
<figure id="attachment_343" aria-describedby="caption-attachment-343" style="width: 585px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/inorden.png"><img loading="lazy" class="wp-image-343 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/inorden.png" alt="árboles" width="585" height="406" /></a><figcaption id="caption-attachment-343" class="wp-caption-text">Fig. 16:En la imagen se muestra como es el recorrido In-Orden, Podemos apreciar que la Raíz no es el primero elemento en ser impreso pues este recorrido recorre su rama izquierda, luego la raíz del sub-árbol y luego la rama derecha.</figcaption></figure>
<p style="text-align: justify;"> </p>
<figure id="attachment_359" aria-describedby="caption-attachment-359" style="width: 392px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/inordencode.png"><img loading="lazy" class="wp-image-359 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/inordencode.png" alt="árboles" width="392" height="127" /></a><figcaption id="caption-attachment-359" class="wp-caption-text">Fig. 17: Código de una función recursiva que recorre un árbol en inorden</figcaption></figure>
<h2 style="text-align: justify;">Búsqueda en amplitud.</h2>
<p style="text-align: justify;">Se recorre primero la raíz, luego se recorren los demas nodos ordenados por el nivel al que pertenecen en orden de Izquierda a derecha.</p>
<p style="text-align: justify;">Este tipo de búsqueda se caracteriza por que la búsqueda se hace nivel por nivel y de izquierda a derecha.</p>
<figure id="attachment_349" aria-describedby="caption-attachment-349" style="width: 475px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/busquedaamplitud.png"><img loading="lazy" class="size-full wp-image-349" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/busquedaamplitud.png" alt="Búsqueda en amplitud en árboles" width="475" height="297" /></a><figcaption id="caption-attachment-349" class="wp-caption-text">Fig. 18: En la imagen se observa como es que un nodo es buscado mediante la búsqueda en profundidad.</figcaption></figure>
<p style="text-align: justify;">En la imagen podemos observa que el árbol es recorrido en su totalidad pero esto no siempre es a sí, ya que el algoritmo se detiene cuando el elemento buscado es encontrado.</p>
<figure id="attachment_361" aria-describedby="caption-attachment-361" style="width: 468px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/anchuracode.png"><img loading="lazy" class="wp-image-361 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/anchuracode.png" alt="árboles" width="468" height="249" /></a><figcaption id="caption-attachment-361" class="wp-caption-text">Fig. 19: Código de un función que recorre el árbol en amplitud.</figcaption></figure>
<p style="text-align: justify;">Si observamos el código de forma minuciosa podemos observar dos puntos muy interesantes, el primero es que esta función no es recursiva, y la segunda es que se utiliza una <a title="Estructura de datos – Queue (Cola)" href="http://oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/">Cola</a> para controlar el flujo del recorrido.</p>
<p style="text-align: justify;">Los pasos para hacer el recorrido es el siguiente:</p>
<ol style="text-align: justify;">
<li>Se agrega la Raíz a la cola de nodos por visitar</li>
<li>Mientras que la cola no este vacía se saca el primer elemento de la cola y continuamos con el paso 3, Pero; si la cola esta vacía entonces nos vamos al paso 5.</li>
<li>Se valida si el elemento sacado de la pila es el que estamos buscando, Si lo es, entonces hemos terminado, Si no lo es se agregan todos los hijos del nodo a la pila de nodos pendientes por procesar.</li>
<li>Regresamos al paso 2.</li>
<li>Terminamos sin un resultado.</li>
</ol>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Conclusiones</h1>
<p style="text-align: justify;">Como hemos observado los arboles son estructuras bastante complejas, tiene una gran aplicaciones en la ciencia y en la programación convencional. En los últimos años este tipo de estructuras ha sido utilizadas con mucha frecuencia en la Inteligencia artificial.</p>
<p style="text-align: justify;">En esta publicación hemos visto los puntos vas relevantes a en cuenta a lo que son los arboles y los principales métodos de búsqueda, sin embargo estamos lejos de cubrir este tema en profundidad ya que existen muchísimos tipos de operaciones y algoritmos que se pueden realizar sobre estas estructuras de datos.</p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;">Espero que este información te sirve de utilidad y no olvides darle like y recomendar esta publicación ya que esto me servirá para crear mas y mejor material.</p><p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/08/22/estructura-de-datos-arboles/">Estructura de datos &#8211; Árboles</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/08/22/estructura-de-datos-arboles/feed/</wfw:commentRss>
			<slash:comments>128</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">311</post-id>	</item>
		<item>
		<title>Pila (Stack)</title>
		<link>https://www.oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/</link>
					<comments>https://www.oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 06 Aug 2014 16:42:36 +0000</pubDate>
				<category><![CDATA[Estructuras de Datos]]></category>
		<category><![CDATA[Estructura de datos]]></category>
		<category><![CDATA[Pila]]></category>
		<category><![CDATA[Stack]]></category>
		<guid isPermaLink="false">http://oscarblancarteblog.com/?p=302</guid>

					<description><![CDATA[<p>En días pasados hablamos acerca de las Colas o Queue las cuales siguen la filosofía FIFO (First In &#8211; First Out) o Primero en entrar &#8211; Primero en salir. Sin embargo, hoy hablaremos de las Pilas o Stack las cuales son un poco diferentes de las Colas, ya que éstas siguen la filosofía LIFO (Last [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/">Pila (Stack)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilain.png"><img loading="lazy" class="wp-image-299 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilain.png" alt="Pila Stack" width="144" height="100" /></a>En días pasados hablamos acerca de las <a title="Estructura de datos – Queue (Cola)" href="http://oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/" target="_blank">Colas o Queue</a> las cuales siguen la filosofía FIFO (First In &#8211; First Out) o Primero en entrar &#8211; Primero en salir. Sin embargo, hoy hablaremos de las <strong>Pilas</strong> o Stack las cuales son un poco diferentes de las Colas, ya que éstas siguen la filosofía <strong>LIFO (</strong>Last In &#8211; First Out) o <strong>Último en entrar primero en salir</strong>.<span id="more-302"></span></p>
<p style="text-align: justify;">Antes de entrar en detalle me gustaría explicar qué son las Pilas de una forma mas simple, para lo cual imaginaremos que tenemos varios platos sucios en casa y queremos lavarlos. Para empezar a lavarlos los tenemos que apilar para tenerlos todos juntos y cada vez que queramos un plato lo que haremos será <span style="font-size: 18px;">tomar el de hasta arriba. Cuando terminamos de lavarlo tomamos el que sigue desde arriba y así hasta terminar; pero supongamos que antes de terminar de lavar llega otra persona y nos pone un plato en la pila de platos que ya tenemos, entonces el plato nuevo quedará hasta arriba. Cuando queramos lavar el siguiente plato tomaremos este último que nos acaban de dejar.</span></p>
<p style="text-align: justify;">Si nos damos cuenta siempre tomamos el de hasta arriba y cuando entra un plato nuevo a la pila siempre entra por arriba.</p>
<p><figure id="attachment_299" aria-describedby="caption-attachment-299" style="width: 463px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilain.png"><img loading="lazy" class="wp-image-299" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilain.png" alt="Estructura de datos - Pila (Stack)" width="463" height="321" /></a><figcaption id="caption-attachment-299" class="wp-caption-text">Fig.1: Muestra como un elemento es depositado en la pila(Izquierda) y como queda la pila después de agregar el elemento(Derecha)</figcaption></figure></p>
<p style="text-align: justify;">Como podemos apreciar en la imagen anterior, cuando un elemento entra a la Pila siempre entra por la parte delantera colocándose hasta el principio.</p>
<p><figure id="attachment_300" aria-describedby="caption-attachment-300" style="width: 480px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilaout.png"><img loading="lazy" class="wp-image-300" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilaout.png" alt="Estructura de datos - Pila (Stack)" width="480" height="291" /></a><figcaption id="caption-attachment-300" class="wp-caption-text">Fig.2: Muestra como sale un elemento de la pila(Izquierda) y Como queda la Pila después de quitar el elemento.</figcaption></figure></p>
<p style="text-align: justify;">Como podemos apreciar en la imagen anterior cuando un elemento sale de la Pila siempre sale el último elemento que entró.</p>
<p style="text-align: justify;">Las pilas son estructuras de datos dinámicas que nos permiten agregar cuantos elementos queramos a la Pila, sin embargo esto no es del todo cierto ya que las Pilas pueden estar limitadas por el espacio en memoria que el programa tenga o que nosotros definamos el máximo de elementos que puede contener la Pila.</p>
<p><figure id="attachment_301" aria-describedby="caption-attachment-301" style="width: 383px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilafull.png"><img loading="lazy" class="wp-image-301 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilafull.png" alt="Estructura de datos - Pila (Stack)" width="383" height="426" /></a><figcaption id="caption-attachment-301" class="wp-caption-text">Fig.3: Muestra como un elemento quiero entrar a una Pila la cual tiene definido un número determinado de espacios por lo cual el elemento que quiere entrar es rechazado.</figcaption></figure></p>
<h1 style="text-align: justify;">Utilidad de las Pilas:</h1>
<p style="text-align: justify;">Como programadores, el primer encuentro que tenemos con las Pilas pueden ser los Errores como StackOverFlow muy comunes cuando realizamos alguna función con recursividad, ya que las funciones cada vez que se llaman a sí mismas, guardan la posición en la que se quedaron ejecutando el programa, debido a que una vez que la función retorne, el programa deberá continuar ejecutándose donde se quedó.</p>
<p style="text-align: justify;">Los compiladores también las utilizan para convertir las Cadenas Infijas a Posfijas (pero hablaremos de esto posteriormente).</p>
<p style="text-align: justify;">Espero que esta información les sea de utilidad y si te gustó, por favor dale Like y compártelo ya que esto me ayudará a crear más y mejor material.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/">Pila (Stack)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">302</post-id>	</item>
		<item>
		<title>Estructura de datos &#8211; Queue (Cola)</title>
		<link>https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/</link>
					<comments>https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 01 Aug 2014 21:47:38 +0000</pubDate>
				<category><![CDATA[Estructuras de Datos]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[Cola]]></category>
		<category><![CDATA[Estructura de datos]]></category>
		<category><![CDATA[queue]]></category>
		<guid isPermaLink="false">http://oscarblancarteblog.com/?p=286</guid>

					<description><![CDATA[<p>En esta entrada quiero platicarles de las Colas (Queue) un tipo de estructura de datos muy utilizada. ¿Pero que es exactamente una colas?, Cuando digo la palabra cola lo mas seguro es que lo primero que se les venga a la mente es una Cola o Fila como cuando vamos al cine y la taquilla [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/">Estructura de datos &#8211; Queue (Cola)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="wp-image-301 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/pilafull.png" alt="Pila Stack" width="90" height="100" />En esta entrada quiero platicarles de las <strong>Colas</strong> (<strong>Queue</strong>) un tipo de estructura de datos muy utilizada. ¿Pero que es exactamente una colas?, Cuando digo la palabra cola lo mas seguro es que lo primero que se les venga a la mente es una Cola o Fila como cuando vamos al cine y la taquilla esta muy llena o cuando vamos a un evento donde se presentara alguien famoso. Si en tu mente paso un escenario a sí te diré que vas por buen camino.</p>
<p>Una <strong>Cola</strong> o <strong>Queue</strong> es una estructura de datos que sigue la <strong>Filosofía FIFO</strong> del ingles<strong> First In &#8211; First Out</strong> que en español seria <em><strong>&#8220;Primero en entrar primero en salir&#8221;</strong></em>. Esto quiere decir que el elemento que entre primero a la Cola sera el primero que salga y el último que entre sera el último en salir.</p>
<p>Un escenario común es cuando vamos al banco, Llegamos y lo primero que haces es tomar un turno, inmediatamente nos damos cuenta que ya había 10 personas primero que tú por lo que automáticamente deduces que ellos serán atendidos primero que tú. Si nos damos cuenta en este escenario el primer cliente que llego y solicito un turno sera el que sea atendido primero y tú que llegaste al último seras atendido hasta el final.</p>
<p>&nbsp;</p>
<p><strong>Agregar elementos a una cola</strong></p>
<p><figure id="attachment_287" aria-describedby="caption-attachment-287" style="width: 547px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colain.png"><img loading="lazy" class=" wp-image-287" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colain.png" alt="Estructura de datos - Cola (Queue)" width="547" height="381" /></a><figcaption id="caption-attachment-287" class="wp-caption-text">Fig.1: Muestra como un elemento es agregado a la cola(Izquierda) y como queda la cola luego de que el nuevo elemento entra en la cola(Derecha).</figcaption></figure></p>
<p>Si apreciamos en la figura anterior cuando un nuevo elemento entra en la cola se posiciona siempre al final de la cola a si mismo este sera el ultimo en salir.</p>
<p><span id="more-286"></span></p>
<p><strong>Extraer un elementos a una cola</strong></p>
<p><figure id="attachment_288" aria-describedby="caption-attachment-288" style="width: 544px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colaout.png"><img loading="lazy" class=" wp-image-288" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colaout.png" alt="Estructura de datos cola - Retirar" width="544" height="325" /></a><figcaption id="caption-attachment-288" class="wp-caption-text">Fig.2: Muestra como un elemento es retirado de la cola(Izquierda) y como queda la cola después de retirar el elemento(Derecha)</figcaption></figure></p>
<p>Como podemos apreciar en la Imagen anterior cuando un elemento es retirado de la cola siempre se retira el primero elemento por lo que el primero en entrar sera el primero en salir y después de esto los demas elementos de la cola se recorren.</p>
<p>&nbsp;</p>
<h2><strong>Colas de prioridad</strong></h2>
<p>&nbsp;</p>
<p>Este es una variante de la <strong>Cola </strong>convencional y trabaja muy parecido a la anterior sin embargo esta tiene un característica que la hace única y es que cuando un nuevo elemento entra en la cola no siempre se coloca al final.</p>
<p>Antes de explicar el funcionamiento me gustaría retomar el Escenario del Banco. Comentamos que el cliente que llegaba primero era el primero en ser atendido sin embargo que pasa cuando llega un cliente el cual es un cliente VIP el cual tiene la tarjeta Platino la cual es la mejor tarjeta que maneja el banco y entre sus beneficios es que es colocado hasta delante de la fila (Siempre y cuando no haya otro cliente con la misma tarjeta, ya que sera colocado detrás de este pero adelante de los demas.), Entonces cuando esta persona llega tenemos que garantizar que se atendido primero que el resto de los clientes que no son VIP.</p>
<p>Para resolver este tipo de problemas tenemos las Colas de Prioridad las cuales tiene un mecanismo para determinar la prioridad de cada elemento de la cola, cuando un elemento entra en la cola lo primero que hace es ver que prioridad tiene y luego lo inserta en la posición que le corresponde.</p>
<p>&nbsp;</p>
<p><figure id="attachment_290" aria-describedby="caption-attachment-290" style="width: 567px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colaprioridadin.png"><img loading="lazy" class="wp-image-290" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colaprioridadin.png" alt="ColaPrioridadIn" width="567" height="407" /></a><figcaption id="caption-attachment-290" class="wp-caption-text">Fig.3: Muestra como un elemento entra en la Cola(Izquierda) y basado en su prioridad(0 es la prioridad máxima) es colocado en la cola(Derecha).</figcaption></figure></p>
<p>Como podemos apreciar en la imagen anterior un elemento con prioridad 1 es colocado en la cola y es puesto casi hasta a delante, sin embargo al tener prioridad 1 no pudo llegar hasta el principio ya que existía un elemento con mas prioridad(Prioridad 0) en la Cola.</p>
<p>Si nos damos cuenta de esta manera podemos priorizar la forma en que los elementos son colocados en la Cola.</p>
<p>&nbsp;</p>
<p><strong>Extraer elementos de una Cola(Queue) de Prioridad</strong></p>
<p><figure id="attachment_291" aria-describedby="caption-attachment-291" style="width: 567px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colaprioridadout.png"><img loading="lazy" class="wp-image-291" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colaprioridadout.png" alt="ColaPrioridadOut" width="567" height="344" /></a><figcaption id="caption-attachment-291" class="wp-caption-text">Fig.4: En la siguiente imagen podemos apreciar como el elementos con prioridad mas alta es sacado de la cola primero(Izquierda) y como queda la Cola una vez que el elemento es retirado.</figcaption></figure></p>
<p>Si prestamos atención la operación de retirar elementos de la Cola es exactamente igual que las colas normales.</p>
<p>&nbsp;</p>
<p>Otra de las cosas importantes cuando trabajamos con Colas(Queue) sean de prioridad o no es que existen implementaciones con capacidad ilimitada o dinámica y Colas con capacidad limitada. Esto quiere decir que existen Colas a las cuales les podemos agregar cuantos elementos queramos a la cola, Sin embargo existen otras implementaciones las cuales solo permite un número limitado de elementos por lo que si un nuevo elemento quiere entrar en la cola sera rechazado hasta que por lo menos un elemento salga.</p>
<p><figure id="attachment_293" aria-describedby="caption-attachment-293" style="width: 391px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colafull.png"><img loading="lazy" class="size-full wp-image-293" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/08/colafull.png" alt="Cola Queue" width="391" height="431" /></a><figcaption id="caption-attachment-293" class="wp-caption-text">Fig.5: En esta figuro se aprecia que el nuevo elemento que intenta entrar a la cola es rechazado debido a que la Cola ya se encuentra llena en su totalidad.</figcaption></figure></p>
<p><strong>NOTA: En una Cola no es permitido sacar ningún elemento que no sea el primero en la Cola ya que de lo contrario se perdería el sentido de utilizar una cola.</strong></p>
<p>&nbsp;</p>
<div class="bs-callout bs-callout-primary">
<h4>Artículos sugeridos</h4>
<p>Si te gusto este Post te sugiero que veas estos dos Post en los cuales las Colas juegan un papel muy importante:<br />
<a title="JMS" href="http://oscarblancarteblog.com/2014/07/25/java-message-service-jms/" target="_blank">Java Message Service (JMS) </a><br />
<a title="JMS en las integraciones" href="http://oscarblancarteblog.com/2014/07/15/jms-en-las-integraciones/" target="_blank">JMS en las integraciones</a></p>
<p>Otras estructuras de datos:<br />
<a href="https://www.oscarblancarteblog.com/2014/08/06/estructura-de-datos-pila-stack/"> Pilas (stack)</a><br />
<a href="https://www.oscarblancarteblog.com/2014/08/22/estructura-de-datos-arboles/"> Árboles (tree)</a>
</div>
<p>&nbsp;</p>
<p>Con esto me despido,  No olvides suscribirte a mi Blog para que seas notificado cuando suba nuevo material, También te pido que si te gusto lo compartas ya que esto me ayudara a crear mas y mejor material.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/">Estructura de datos &#8211; Queue (Cola)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">286</post-id>	</item>
	</channel>
</rss>
