SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
12007-2008, Módulo 4
Módulo 4
TDAs Contenedores
Complejos
22007-2008, Módulo 4
Objetivos
● Comprender el concepto de árbol
● Conocer la terminología y las formas de
recorrer el contenido de un árbol
● Conocer las especificaciones de los
TDAs tree y bintree
● Manejar los ABB, APO, AVL
● Introducir el concepto de grafo y su
especificación
32007-2008, Módulo 4
TDAs Contenedores Complejos
Árboles
42007-2008, Módulo 4
Árboles
Es una estructura
jerárquica:
● Para cada elemento no
hay tan sólo un
anterior y un siguiente.
● Existen elementos por
encima (padres) y por
debajo (hijos).
52007-2008, Módulo 4
Árbol: Definición recursiva
Un árbol T es un conjunto de nodos que almacenan
elementos mediante una relación padre-hijo con la
siguiente propiedad:
● Un nodo es un árbol.
● Un árbol vacío (con cero nodos) también es un
árbol.
● Si tomamos N árboles y cada una de sus raíces las
hacemos hijo de un nodo, el resultado también es
un árbol.
62007-2008, Módulo 4
Terminología
● Existe una relación entre nodos en la que el nodo que está
por encima se llama padre y el de abajo hijo.
● Nodo raíz es el único nodo que no tiene padre.
● Nodo hoja es aquel que no tiene hijos.
● Dos nodos que son hijos de un mismo nodo se llaman
hermanos. Pueden estar ordenados de izquierda a derecha
y en ese caso diremos que tenemos un árbol ordenado.
● Un nodo v es ancestro de un nodo n si se puede llegar
desde n hasta v siguiendo la relación padre.
72007-2008, Módulo 4
Terminología (2)
● Un nodo v es descendiente de un nodo n si se puede llegar
desde n hasta v siguiendo los hijos.
● Un nodo n es un interior si tiene hijos.
● Un nodo n es un exterior si no tiene hijos (hoja).
● Un nodo puede contener información, a la que se llama
etiqueta del nodo.
● Un árbol etiquetado es aquél cuyos nodos poseen etiquetas.
● La profundidad de un nodo es el número de relaciones padre
que hay que seguir para llegar desde ese nodo hasta el nodo
raíz. La raíz tiene profundidad cero.
82007-2008, Módulo 4
Terminología (3)
● Un nivel consiste en el conjunto de nodos que se
encuentran a la misma profundidad.
● La altura de un nodo es el número de relaciones hijo que
hay que seguir hasta alcanzar su descendiente hoja más
lejano. Una hoja tiene altura cero.
● La altura de un árbol es la altura de su nodo raíz.
● Tenemos un subárbol de un árbol si cogemos un nodo y
todos sus descendientes.
● Un árbol parcial de un árbol es un árbol que tan sólo
tiene algunos de los nodos del árbol original
92007-2008, Módulo 4
Terminología (4)
● Un subárbol parcial es un subárbol del que no tenemos
todos sus descendientes.
● En los árboles generales no hay un número máximo de
hijos por nodo.
– Si el número máximo de hijos por nodo es 2 diremos que
el árbol es binario,
– si es tres, ternario,
– ...
– y en general n-ario.
● Un árbol se dice ordenado si se establece un orden lineal
entre los hijos de cada nodo (1º, 2º, 3º, ...)
102007-2008, Módulo 4
Ejemplo 1
● Un documento estructurado (libro) se organiza
jerárquicamente como un árbol ordenado cuyos
nodos internos son los capítulos, secciones y
subsecciones y cuyos nodos externos son los
párrafos.
112007-2008, Módulo 4
Ejemplo 2
● Una expresión aritmética se puede
representar como un árbol cuyos
nodos externos son variables o
constantes y cuyos nodos internos
son operadores (+,*,/,-).
● Cada nodo de árbol tiene asociado
un valor:
– Si es externo, el que indica la
variable o constante
– Si es interno, el valor se
determina al aplicar las op.
para cada uno de sus hijos.
e = -2
a = 3
3
6 2
8
122007-2008, Módulo 4
Otros Ejemplos
● Jerarquía de clases (directorio de yahoo)
● Árbol de sintaxis (estructura de una oración)
● Árbol genealógico
● Jerarquía Territorial (País, Comunidad Autónoma,
Provincia, Municipio, ....)
● Estructura de una competición por eliminatorias.
● .......
132007-2008, Módulo 4
Tipo de Dato Árbol
● El TDA árbol almacena elementos en los nodos de
éste. Así, un nodo de un árbol se puede ver como
el equivalente a una posición del TDA list.
142007-2008, Módulo 4
Tipo de Dato Árbol (2)
● Tenemos TDA tree y TDA node
– node root() const; Devuelve la raíz del árbol;
– bool is_root(node v) const;
Devuelve true si v es la raíz del árbol, falso en caso contrario;
– bool is_internal(node v) const;
Verdadero si el nodo es interno, false en caso contrario
– bool is_external(node v) const;
Verdadero si el nodo es externo, false en caso contrario
– size_type size() const ; devuelve en número de nodos de un
árbol.
– ......
152007-2008, Módulo 4
TDA node
● Dado un nodo, un TDA nodo debe presentar
métodos que permita movernos por el árbol.
– node parent() const;
devuelve el padre del nodo en el árbol o nodo nulo si es la raíz
del árbol.
– node left() const;
devuelve el hijo izquierda en el árbol, o nodo nulo si no tiene.
– node next_sibling() const;
devuelve el hermano derecha en el árbol, o nodo nulo no tiene.
– T & operator*();
devuelve la etiqueta del nodo (también existe la versión
constante const T& operator*() const)
- bool null() const;
devuelve si el nodo es nulo (no confundir con que valga
NULL!!)
162007-2008, Módulo 4
Moviéndonos por un árbol
int profundidad(const tree<T> & A, const 
typename tree<T>::node &v)
{
  int prof = 0;
  while (!A.is_root(v)) {
    prof++;
    v = v.parent();
  }
  return prof;
}
172007-2008, Módulo 4
Moviéndonos por un árbol (2)
● Altura del nodo v: (Máxima profund. de un nodo
externo)
Definición recursiva:
– Si v es externo, la altura es 0.
– En otro caso, uno más la máxima altura de los hijos de
v.
182007-2008, Módulo 4
Moviéndonos por un árbol (3)
● Implementación (Orden O(n))
int altura(const tree<T> & A, const 
typename tree<T>::node &v)
{    if (A.is_external(v)) return 0;
     else {
        int alt = 0; 
        tree<T>::node aux;
        for (aux = v.left(); !aux.null();
            aux = aux.next_sibling())
            alt = max(alt,altura(A,aux));
        return 1+alt; } 
}
192007-2008, Módulo 4
Recorridos
● Mecanismo por el cual podemos visitar (acceder) todos los
nodos de un árbol.
● No existe un único criterio.
– Preorden:
Visitar primero la raíz y luego visitar en preorden cada
uno de los subárboles que son “hijos” del nodo raíz
– Postorden:
Visitar primero en postorden cada uno subárboles “hijos”
del nodo raíz y finalmente visitar la raíz
202007-2008, Módulo 4
Recorridos (2)
– Inorden:
Visitar primero en inorden el subárbol izquierdo, después
la raíz y después en inorden el resto de los hijos.
– En anchura:
Visitar en orden los nodos de profundidad 0, después los
de profundidad 1, profundidad 2, ....
212007-2008, Módulo 4
Preorden
Visitar primero la raíz y luego visitar en preorden cada uno de los
subárboles que son “hijos” del nodo raíz
222007-2008, Módulo 4
Algoritmo preorden, O(n)
void preorden(const tree<T> & A, const typename 
tree<T>::node &v)
{ 
  typename tree<T>::node aux;
  if (!v.null()) {  
     cout << *v;   //  acción sobre el nodo v.
     for (aux = v.left(); !aux.null(); 
        aux = aux.next_sibling())
           preorden(A, aux);
  }
}
● Produce un orden lineal de los nodos donde un nodo aparece
antes que los hijos.
● Si A es un documento estructurado, entonces
preorden(A, A.root()) examina el documento secuencialmente, del
principio al final.
232007-2008, Módulo 4
Postorden
Visitar primero en postorden cada uno subárboles
“hijos” del nodo raíz y finalmente visitar la raíz
242007-2008, Módulo 4
Algoritmo postorden, O(n)
void postorden(const tree<T> &A, const typename 
tree<T>::node &v)
{
   typename tree<T>::node aux;
   if (!v.null ()) {
      for (aux = v.left(); !aux.null(); 
        aux =aux.next_sibling())
         postorden(A, aux);  
      cout << *v;   //  acción sobre el nodo v.
   }
}
● Produce un orden lineal de los nodos donde un nodo aparece después 
que los hijos.
● Si A es un árbol de directorios donde los nodos externos representan 
los ficheros, entonces  postorden(A, v) nos permite conocer el espacio 
de disco ocupado por  v.
252007-2008, Módulo 4
Inorden
Visitar primero en inorden el subárbol izquierdo,
después la raíz y después en inorden el resto de los
hijos.
262007-2008, Módulo 4
Algoritmo inorden, O(n)
void inorden(const tree<T> & A, const typename 
tree<T>::node &v)
{
  typename tree<T>::node aux;
   if (!v.null()) {
      aux = v.left();
      if (!aux.null())
         inorden(A, v.left());
      cout << *v;   //  acción sobre el nodo v.
      while (!aux.null()) {
         aux = aux.next_sibling())
         inorden(A,aux);
      }
   }
}
● Es de especial interés para árboles binarios, en
particular, los ordenados.
272007-2008, Módulo 4
Árboles de Expresión y Recorridos
● Tanto la expresión
en prefijo como en
postfijo permiten
recuperar
unívocamente el
árbol de expresión.
● La expresión en
infijo sólo lo
permite si está
parentizada.
282007-2008, Módulo 4
Por Niveles o anchura
Visitar en orden los nodos de profundidad 0,
después los de profundidad 1, profundidad 2, ....
292007-2008, Módulo 4
Algoritmo Niveles, O(n)
void Niveles(const tree<T> & A, const typename 
tree<T>::node &v)
{
  typename tree<T>::node aux;
  queue<tree<T>::node> Cola;
  if (!v.null()) {
     Cola.push(v);
     while ( !Cola.empty() ) { 
        aux = Cola.front();
        cout << *aux; // acción sobre el nodo v.
        for (aux=aux.left(); !aux.null(); 
          aux=aux.next_sibling())
           Cola.push(aux);
        Cola.top();
     }
  }
}  
302007-2008, Módulo 4
Árboles Binarios
● Un árbol binario es un árbol ordenado en el que cada
nodo interno tiene como máximo dos hijos.
Sea A un árbol propio (todos los nodos internos tienen 2
hijos), n el número de nodos y h su altura, entonces
– Un nivel (profundidad) d tiene como máximo 2d
nodos
– h+1 <= número de nodos externos <= 2h
– h<= número de nodos internos <= (2h
) -1
– 2h+1 <= n <= 2^(h+1) -1
– log(n+1) -1 <= h <= (n-1)/2
– El número de nodos externos es 1 más que el número de nodos
internos
312007-2008, Módulo 4
Árboles binarios
● Es necesaria una subclase interna node para
poder movernos por el árbol.
● Qué debe tener todo nodo:
– constructor por defecto: node();
– constructor que crea un nodo con etiqueta e:
node(const T& e);
– determina si el receptor es el nodo nulo:
bool null() const;
– devuelve el nodo padre de un nodo receptor no nulo:
node parent() const;
– devuelve el nodo hijo a la izquierda de un receptor no
nulo:
node left() const;
322007-2008, Módulo 4
Árboles binarios (2)
● Qué debe tener todo nodo:
– devuelve el nodo hijo a la derecha de un receptor no
nulo:
node right() const;
– devuelve la etiqueta de un nodo receptor no nulo:
T& operator*() const;
– elimina el contenido de un nodo receptor no nulo,
convirtiéndolo en el nodo nulo:
void erase();
– asigna al receptor el contenido de un nodo a:
node& operator=(const node& a);
– determina si un nodo a es igual al receptor:
bool operator==(const node& a) const;
332007-2008, Módulo 4
Árboles binarios (3)
● Qué debe tener todo nodo:
– determina si un nodo a es distinto al receptor:
bool operator!=(const node& a) const;
342007-2008, Módulo 4
Árboles Binarios (5)
/** TDA bintree.
Representa un árbol binario con nodos etiquetados
con datos del tipo T, que debe tener definidas las
operaciones:
● T & operator=(const T & e);
● bool operator!=(const T & e);
● bool operator==(const T & e);
Exporta tipos:
node, preorder_iterator, postorder_iterator,
inorder_iterator, level_iterator
y sus versiones const
Son mutables y residen en memoria dinámica.
*/
352007-2008, Módulo 4
Árboles Binarios (6)
● Qué métodos debe tener:
– el constructor por defecto: bintree();
– el constructor con un nodo raíz de etiqueta e:
bintree(const T& e);
– el constructor de copia:
bintree(const bintree<T> &A);
– asignación al receptor de un subárbol de otro árbol A,
subárbol que empieza en el nodo n:
assign_subtree(const bintree<T> &A,
bintree<T>::node &n);
362007-2008, Módulo 4
Árboles Binarios (7)
● Qué métodos debe tener:
– el destructor: ~bintree();
– el operador de asignación, que asigna a un receptor
una copia del contenido de otro árbol A, destruyendo
previamente el contenido del receptor:
bintree<T>& operator= (const bintree<T>& A);
– el acceso al nodo raíz de un receptor:
node root () const;
– el método que poda todo el subárbol izquierdo de un
nodo dado (es decir, el subárbol que tiene al hijo
izquierdo de un nodo dado como raíz), devolviendo
dicho subárbol y eliminándolo del receptor:
void prune_left (bintree<T>::node n,
bintree<T>& dest);
372007-2008, Módulo 4
Árboles Binarios (8)
● Qué métodos debe tener:
– el método que poda todo el subárbol derecho de un
nodo dado (es decir, el subárbol que tiene al hijo
derecho de un nodo dado como raíz), devolviendo
dicho subárbol y eliminándolo del receptor:
void prune_right (typename bintree<T>::node n,
bintree<T>& dest);
– el método que cuelga un árbol branch como subárbol
izquierdo de un nodo n y anula el árbol branch:
void insert_left (typename bintree<T>::node n,
bintree<T>& branch);
– el método que cuelga un árbol branch como subárbol
derecho de un nodo n y anula el árbol branch:
void insert_right (typenamebintree<T>::node n,
bintree<T>& branch);
382007-2008, Módulo 4
Árboles Binarios (9)
● Qué métodos debe tener:
– destruye todos los nodos del receptor convirtiéndolo
en el árbol nulo:
void clear ();
– calcula el tamaño del receptor en número de nodos:
size_type size () const;
– especifica si un árbol es el árbol nulo:
bool null () const;
– determina si el receptor es igual a otro árbol a que se
le pasa:
bool operator== (const bintree<T>& a) const;
– determina si el receptor es distinto a otro árbol a que
se le pasa:
bool operator!= (const bintree<T>& a) const;
392007-2008, Módulo 4
Ejemplos de Uso (I)
bool esHoja(const bintree<T> & A, const 
typename bintree<T>::node &v)
{ return ( v.left().null()  &&
               v.right().null() ); }
bool esInterno(const bintree<T> & A, 
const typename bintree<T>::node &v)
{ return ( !v.left().null() ||
               !v.right().null() ); }
402007-2008, Módulo 4
Ejemplos de Uso (II): Recorrido
Preorden
void PreordenBinario(const bintree<T> & A,
typename bintree<T>::node v){
  if (!v.null()) {
       cout << *v; // acción sobre el nodo v.
       PreordenBinario(A, v.left());
       PreordenBinario(A, v.right());
  }
}
412007-2008, Módulo 4
Ejemplos de Uso (III): Recorrido
Inorden
void InordenBinario(const bintree<T> & A,
 typename bintree<T>::node v)
{ 
  if (!v.null()) {
       InordenBinario(A, v.left());
       cout << *v; //acción sobre el nodo v.
       InordenBinario(A, v.right());
  }
}
422007-2008, Módulo 4
Ejemplos de Uso (IV): Recorrido
Postorden
void PostordenBinario(const bintree<T> & A,
 typename bintree<T>::node v)
{ 
  if (!v.null()) {
       PostordenBinario(A, v.left());
       PostordenBinario(A, v.right());
       cout << *v; // acción sobre el nodo v.
  }
}
432007-2008, Módulo 4
Ejemplos de Uso (V): Recorrido
por Niveles
void ListarPostNiveles(const bintree<T> &A,
  typename bintree<T>::node n)
{
  queue<bintree<T>::node> nodos;
  if (!n.null()) {
    nodos.push(n);
    while (!nodos.empty()) {
      n = nodos.front(); nodos.pop();
      cout << *n;
      if (!n.left().null()) nodos.push(n.left());
      if (!n.right().null()) 
nodos.push(n.right());
    }
  }
}
442007-2008, Módulo 4
#include <iostream>
#include "bintree.h"
using namespace std;
int main()
{  // Creamos el árbol:
  //        7
  //     /    
  //    1      9
  //  /      /
  // 6    8  5
  //       
  //       4
Ejemplos de Uso (VI)
452007-2008, Módulo 4
Construimos el árbol...
typedef bintree<int> bti;
bintree<int> Arb(7);
Arb.insert_left(Arb.root(), bti(1));
Arb.insert_right(Arb.root(), bti(9));
Arb.insert_left(Arb.root().left(), bti(6));
Arb.insert_right(Arb.root().left(), bti(8));
Arb.insert_right(Arb.root().left().right(), 
bti(4));
Arb.insert_left(Arb.root().right(), bti(5));
462007-2008, Módulo 4
Iteradores para árboles
De acuerdo a los cuatro recorridos definidos
sobre árboles binarios, se precisan cuatro
iteradores:
● preorder_iterator: itera sobre los nodos
recorridos en preorden,
● postorder_iterator: itera sobre los nodos
recorridos en postorden,
● inorder_iterator: itera sobre los nodos
recorridos en inorden,
● level_iterator: itera sobre los nodos
recorridos por niveles.
472007-2008, Módulo 4
Recorrido en PreOrden
typename bintree<T>::preorder_iterador 
it_p;  
for (it_p= Arb.begin_preorder();
       it_p!=Arb.end_preorder(); ++it_p)
     cout << *it_p << " ";
  cout << endl;
482007-2008, Módulo 4
Recorrido en PostOrden
  for (typename 
bintree<T>::postorder_iterator
    i = Arb.begin_postorder();
    i != Arb.end_postorder();
    ++i)
    cout << *i << " ";
  cout << endl;
492007-2008, Módulo 4
Recorrido en InOrden
  for (typename 
bintree<T>::inorder_iterator i = 
Arb.begin_inorder();
i != Arb.end_inorder();
++i)
    cout << *i << " ";
  cout << endl;
502007-2008, Módulo 4
Recorrido por Niveles
  for (typename 
bintree<T>::level_iterator i =
Arb.begin_level();
    i != Arb.end_level();
    ++i)
    cout << *i << " ";
  cout << endl;
512007-2008, Módulo 4
Módulo 4
Árboles Binarios de Búsqueda (BST)
Árboles Equilibrados (AVL)
Árboles Parcialmente Ordenados (POT)
522007-2008, Módulo 4
Árboles binarios de búsqueda:
Motivación
La búsqueda binaria es un proceso
rápido de búsqueda de elementos en un
vector ordenado O(log(n)).
Sin embargo, las inserciones y borrados
son muy ineficientes (O(n)).
Los BST son de utilidad para representar
TDAs donde las operaciones de
búsqueda, inserción y borrado sean
eficientes, además de permitir acceder
a los elementos de forma ordenada.
532007-2008, Módulo 4
BST: Definición.
Árbol Binario de Búsqueda (BST): árbol
binario que verifica que:
● todos los elementos almacenados en el
subárbol izquierdo de un nodo n son
menores que el elemento almacenado
en n,
● todos los elementos del subárbol
derecho de n son mayores que el
elemento almacenado en n.
542007-2008, Módulo 4
BST: Propiedades
● Son árboles binarios en los que para cada
nodo se cumple que:
– Tanto su hijo a la izquierda como los
descendientes de éste tienen una etiqueta
menor que la del nodo.
– Tanto su hijo a la derecha como los
descendientes de éste tienen una etiqueta
mayor que la del nodo
● Es un tipo de dato orientado a búsqueda, es
decir, que tan sólo tiene operaciones para crear,
destruir, insertar etiquetas, borrar etiquetas y
buscar etiquetas (aparte de un iterador)
552007-2008, Módulo 4
– Si el árbol está equilibrado, las
operaciones de inserción, búsqueda y
borrado de un elemento se pueden realizar
en orden O(log(n))
– El recorrido en inorden da el conjunto de
etiquetas ordenado
BST: Propiedades (2)
562007-2008, Módulo 4
BST: Ejemplo
572007-2008, Módulo 4
/**  TDA BST::BST, insert, find, erase, size, 
clear, empty, begin, end, ~BST
 El TDA BST representa objetos que abstraen el 
concepto de Árbol Binario de Búsqueda. Es un tipo 
contenedor, cuyos componentes son Entradas 
formadas por dos partes {clave, valor}, de tipos 
Key y T, resp.
 Los objetos Key deben tener las operaciones:
 ­ bool operator<(const Key & c);
 ­ bool operator==(const Key & c);
 Los objetos T deben tener las operaciones:
 ­ bool operator==(const T & c);
 
*/
BST: Especificación
bool operator<(const T & c);
582007-2008, Módulo 4
BST: Especificación (2)
● Qué métodos debe tener:
– el constructor por defecto: BST();
– modificador que inserta o actualiza una entrada
entrada de clave especificada dentro del BST:
void insert(const pair<Key, T> & entrada);
– método que busca un valor de clave clave específico
dentro del BST y devuelve un iterador que lo contiene
(si no está, devuelve end()):
iterator find(const Key & clave);
– método que devuelve el número de entradas del BST:
size_type size() const;
– modificador que elimina todas las entradas del
receptor:
void clear();
592007-2008, Módulo 4
BST: Especificación (3)
● Qué métodos debe tener:
– método que indica si el receptor está vacío:
bool empty() const;
– método que devuelve la posición dela primera entrada
del BST:
iterator begin() const;
– método que devuelve la posición siguiente a la última
entrada del BST receptor:
iterator end() const;
– destructor que libera todos los recursos asociados al
BST receptor:
~BST();
602007-2008, Módulo 4
BST::iterator : especificación
● Qué métodos debe tener:
– Método que devuelve el par (clave, dato) que contiene
la posición del iterador (que no puede estar en la
posición end):
pair<Key, T> operator*() const;
– método que avanza el iterador a la siguiente posición
del BST:
void operator++ ();
612007-2008, Módulo 4
Ejemplo Uso BST
  BST<string, string> arb;
  string palabras[NUM] = {"piedra", "tiza",... };
  string definiciones[NUM] = {"objeto muy duro",  
      "objeto muy blando", ...};  
  for (int i= 0; i<NUM; i++) 
    arb.insert(pair<string,string>(palabras[i], 
      definiciones[i]));  
  cout << "Num.datos: " << arb.size();
  BST<string, string>::iterator i;
  for (i = arb.begin(); i != arb.end(); ++i)
     cout << (*i).first << ": " << (*i).second << endl;
622007-2008, Módulo 4
Ejemplo Uso BST: Ordenación
template <class T>
void ordenar(T v[], int num_datos)
{
  int i;
  BST<T,char> abb;
  for (i = 0; i < num_datos; i++)
    abb.insert(pair<T,char>(v[i], ''));
  BST<T,char>::iterator ite;
  for (ite = abb.begin(), i = 0;
     ite != abb.end(); ++ite, i++)
        v[i] = (*ite).first;
}
632007-2008, Módulo 4
Arbol Equilibrados: AVL
Motivación:
● Las operaciones de Búsqueda,
Inserción y Borrado en un BST
genérico son de orden
O(altura(arbol)) !!!
Arboles Equilibrados
Altura (arbol) es de O(log(n))
642007-2008, Módulo 4
Arboles AVL
BST Equilibrado donde las operaciones de
búsqueda e inserción y borrado tienen un
orden de eficiencia logarítmico.
para cada nodo se cumple que:
la diferencia de la altura de sus dos hijos es
menor que uno (en valor absoluto).
● La especificación coincide con la del BST
● La implementación varía en las operaciones
que modifican la altura de un nodo: insertar
y borrar.
652007-2008, Módulo 4
Inserción en AVL (I)
662007-2008, Módulo 4
Inserción en AVL (II)
672007-2008, Módulo 4
Arbol parcialmente ordenado
● Son árboles equilibrados que permiten
obtener el mínimo de un conjunto de datos de
forma eficiente O(log_2 n)
● Cuando se añade un elemento siempre se
hace lo más a la izquierda posible en el nivel
que no esté completo, y si el nivel está
completo como el elemento más a la
izquierda en el siguiente nivel.
● Son las estructuras utilizadas en las colas
con prioridad
682007-2008, Módulo 4
Ejemplo POT
4
5
2
5
68
1 0
1 0
692007-2008, Módulo 4
POT: Especificación
● Qué métodos debe tener:
– el constructor por defecto: POT(int tam);
– el constructor de copia:
POT (const POT<T> &copiado);
– método que devuelve el número de entradas del POT:
size_type size() const;
– método que devuelve el elemento más pequeño del
receptor (que debe tener al menos un elemento):
T min() const;
– método que inserta el elemento elem en el receptor:
void insert (const T& elem);
– método que elimina un elemento de etiqueta elem en
el receptor (si existe más de uno, borra uno de ellos):
void erase (const T& elem);
702007-2008, Módulo 4
POT: inserción
1 0
8 5
4
2
5
1 0 6
1 1 0
5
4
2
5
1 0 61
8
1 0
5
2
5
1 0 6
8
1
4
1 0
5
5
1 0 6
8
4
1
2
712007-2008, Módulo 4
POT: Borrado
4
5
2
5
68
1 0
1 0 8 5
54
1 0
61 0
8 5
5
4
1 0
61 0
8
5
4
5
1 0
61 0
722007-2008, Módulo 4
TDAs Contenedores Complejos
Grafos
732007-2008, Módulo 4
TDA Grafo
Sea un conjunto de puntos, .
● Un grafo es un par ,con .
● Los elementos de se llaman nodos o
vértices.
● Supondremos
● Los elementos de se llaman lados.
742007-2008, Módulo 4
TDA Grafo
● Un grafo se dice dirigido cuando el
orden de los componentes de los pares
de es relevante: . Sus
lados denominan arcos.
● Un grafo se dice no dirigido cuando el
orden de los componentes de los pares
de no es relevante. Sus lados se
llaman aristas.
752007-2008, Módulo 4
Conceptos sobre grafos
● Camino: dados se dice que
existe un camino entre y si existe
una secuencia de pares de :
● Se llama longitud del camino al número
de pares.
● Un camino de a es un ciclo sii
● Un camino se dice simple cuando en él
no hay ciclos.
762007-2008, Módulo 4
Conceptos sobre grafos
● Dados se dice que es
adyacente a si .
● Casos particulares importantes de
grafos:
– Grafos dirigidos acíclicos (GDA).
– Arboles. (Grafos conexos acíclicos).
772007-2008, Módulo 4
Recorridos en grafos
● La resolución eficiente de muchos
problemas relacionados con grafos
dirigidos requiere realizar la visita
sistemática de los vértices y/o arcos
● Existen dos recorridos principales, que
son base de muchos algoritmos:
búsqueda en profundidad y búsqueda
en anchura.
782007-2008, Módulo 4
Recorrido en profundidad
● Se trata de una generalización del recorrido en preorden de un
árbol.
enum { VISITADO, NO_VISITADO } Estado;
Estado marca[n];
RecorridoProfundidad()
{
  para v de V
    marca[v] = NO_VISITADO;
  para v de V
    si marca[v] == NO_VISITADO
      rp(v);
}
rp(v)
{
  marca[v] = VISITADO;
  para cada w adyacente a v
    si marca[w] == NO_VISITADO
      rp(w);
}
792007-2008, Módulo 4
Recorrido en profundidad(2)
Registro del recorrido en profundidad:
● Numeración en preorden: Asignar a cada vértice un
número según el orden en que se visita. Añadir al
principio de rp(v).
nump = nump + 1
prenump[v] = nump
● Numeración en postorden: Asignar a cada nodo un
número después de haber visitado todos sus nodos
adyacentes. Añadir al final de rp(v).
nump = nump + 1
postump[v] = nump
802007-2008, Módulo 4
Recorrido en profundidad:ejemplo
812007-2008, Módulo 4
Recorrido en anchura
● La idea es visitar un nodo, después intentar visitar un vecino de
éste, luego un vecino de este vecino, y así sucesivamente. Es una
generalización del recorrido por niveles de un árbol.
● Se usa, principalmente, para explorar parcialmente grafos infinitos
o para encontrar el camino mínimo entre dos puntos.
RecorridoAnchura()
{
  para cada v de V
    marca[v] = NO_VISITADO
  para cada v de V
    si marca[v] == NO_VISITADO
      ra(v)
}
822007-2008, Módulo 4
Recorrido en anchura(2)
ra(vertice v)
{
  Cola<vertice> c;
  marca[v] = VISITADO;
  c.insertar(v);
  mientras (no c.vacia()) {
    u = c.cabeza();
    c.sacar();
    para cada w adyacente a u {
      si marca[w] `== NO_VISITADO
        marca[w] = VISITADO
        c.insertar(w);
    }
  }
} 

Más contenido relacionado

La actualidad más candente

Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructurasVana Cigarroa
 
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)Rubi Veronica Chimal Cuxin
 
Arboles
ArbolesArboles
ArbolesUTCH
 
Ordenamiento con árbol binario
Ordenamiento con árbol binarioOrdenamiento con árbol binario
Ordenamiento con árbol binarioedwinosuna
 
Estructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no LinealesEstructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no LinealesJosé Antonio Sandoval Acosta
 
Exposicion de estructuras discretas
Exposicion de estructuras discretasExposicion de estructuras discretas
Exposicion de estructuras discretasjcdlcs
 
Arboles En Estructura de Datos
Arboles En Estructura de DatosArboles En Estructura de Datos
Arboles En Estructura de DatosDARKGIRL93
 
Arboles presentacion
Arboles presentacionArboles presentacion
Arboles presentacionjenny
 
Unidad v arboles
Unidad v arbolesUnidad v arboles
Unidad v arbolesAnthony Can
 

La actualidad más candente (18)

Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 
2 arboles
2 arboles2 arboles
2 arboles
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
 
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
 
Unidad i
Unidad iUnidad i
Unidad i
 
Estructuras de datos
Estructuras de datosEstructuras de datos
Estructuras de datos
 
Arboles
ArbolesArboles
Arboles
 
Ordenamiento con árbol binario
Ordenamiento con árbol binarioOrdenamiento con árbol binario
Ordenamiento con árbol binario
 
Estructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no LinealesEstructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no Lineales
 
Estructura de datos
Estructura de datosEstructura de datos
Estructura de datos
 
Exposicion de estructuras discretas
Exposicion de estructuras discretasExposicion de estructuras discretas
Exposicion de estructuras discretas
 
Arboles En Estructura de Datos
Arboles En Estructura de DatosArboles En Estructura de Datos
Arboles En Estructura de Datos
 
Unidad 4
Unidad 4Unidad 4
Unidad 4
 
Arboles presentacion
Arboles presentacionArboles presentacion
Arboles presentacion
 
Xpath
XpathXpath
Xpath
 
Unidad v arboles
Unidad v arbolesUnidad v arboles
Unidad v arboles
 
Arboles
ArbolesArboles
Arboles
 
Abstraccion ppt
Abstraccion pptAbstraccion ppt
Abstraccion ppt
 

Similar a Árboles y grafos (20)

04 curso-prope-py ed-arboles
04 curso-prope-py ed-arboles04 curso-prope-py ed-arboles
04 curso-prope-py ed-arboles
 
Arboles TDAS
Arboles TDASArboles TDAS
Arboles TDAS
 
Estructura de datos unidad 4 y 5
Estructura de datos unidad 4 y 5Estructura de datos unidad 4 y 5
Estructura de datos unidad 4 y 5
 
ED Unidad 4: Estructuras de datos no lineales (árboles)
ED Unidad 4: Estructuras de datos no lineales (árboles)ED Unidad 4: Estructuras de datos no lineales (árboles)
ED Unidad 4: Estructuras de datos no lineales (árboles)
 
ARBOLES
ARBOLESARBOLES
ARBOLES
 
Programacion estructura de arboles en c
Programacion estructura de arboles en cProgramacion estructura de arboles en c
Programacion estructura de arboles en c
 
tema4.pdf
tema4.pdftema4.pdf
tema4.pdf
 
Arboles
ArbolesArboles
Arboles
 
12. Arboles.ppt
12. Arboles.ppt12. Arboles.ppt
12. Arboles.ppt
 
Arboles
ArbolesArboles
Arboles
 
Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 
Concepto de Árbol
Concepto de ÁrbolConcepto de Árbol
Concepto de Árbol
 
Practica colas (if, else)
Practica colas (if, else)Practica colas (if, else)
Practica colas (if, else)
 
Árboles Binarios
Árboles BinariosÁrboles Binarios
Árboles Binarios
 
Arboles Ordenados
Arboles OrdenadosArboles Ordenados
Arboles Ordenados
 
Arboles.pptx
Arboles.pptxArboles.pptx
Arboles.pptx
 
arboles_bin.pdf
arboles_bin.pdfarboles_bin.pdf
arboles_bin.pdf
 
Sustentacion arboles
Sustentacion arbolesSustentacion arboles
Sustentacion arboles
 
estructuras no lineales
estructuras no linealesestructuras no lineales
estructuras no lineales
 
Arboles
ArbolesArboles
Arboles
 

Último

Tiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IITiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IILauraFernandaValdovi
 
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIACOMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIARafaelPaco2
 
183045401-Terminal-Terrestre-de-Trujillo.pdf
183045401-Terminal-Terrestre-de-Trujillo.pdf183045401-Terminal-Terrestre-de-Trujillo.pdf
183045401-Terminal-Terrestre-de-Trujillo.pdfEdwinAlexanderSnchez2
 
Fijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEFijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEANDECE
 
Cadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operacionesCadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operacionesal21510263
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023ANDECE
 
PRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potenciaPRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potenciazacariasd49
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaSHERELYNSAMANTHAPALO1
 
4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx
4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx
4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptxGARCIARAMIREZCESAR
 
Sesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERUSesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERUMarcosAlvarezSalinas
 
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdfManual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdfSandXmovex
 
3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptx3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptxJhordanGonzalo
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaANDECE
 
Electromagnetismo Fisica FisicaFisica.pdf
Electromagnetismo Fisica FisicaFisica.pdfElectromagnetismo Fisica FisicaFisica.pdf
Electromagnetismo Fisica FisicaFisica.pdfAnonymous0pBRsQXfnx
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdfAnthonyTiclia
 
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdfCAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdfReneBellido1
 
Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxEduardoSnchezHernnde5
 
Parámetros de Perforación y Voladura. para Plataformas
Parámetros de  Perforación y Voladura. para PlataformasParámetros de  Perforación y Voladura. para Plataformas
Parámetros de Perforación y Voladura. para PlataformasSegundo Silva Maguiña
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
Conservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de AlmeríaConservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de AlmeríaANDECE
 

Último (20)

Tiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IITiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo II
 
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIACOMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
 
183045401-Terminal-Terrestre-de-Trujillo.pdf
183045401-Terminal-Terrestre-de-Trujillo.pdf183045401-Terminal-Terrestre-de-Trujillo.pdf
183045401-Terminal-Terrestre-de-Trujillo.pdf
 
Fijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEFijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSE
 
Cadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operacionesCadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operaciones
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
 
PRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potenciaPRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potencia
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresa
 
4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx
4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx
4.6 DEFINICION DEL PROBLEMA DE ASIGNACION.pptx
 
Sesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERUSesion 02 Patentes REGISTRO EN INDECOPI PERU
Sesion 02 Patentes REGISTRO EN INDECOPI PERU
 
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdfManual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdf
 
3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptx3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptx
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes Granada
 
Electromagnetismo Fisica FisicaFisica.pdf
Electromagnetismo Fisica FisicaFisica.pdfElectromagnetismo Fisica FisicaFisica.pdf
Electromagnetismo Fisica FisicaFisica.pdf
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
 
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdfCAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
 
Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptx
 
Parámetros de Perforación y Voladura. para Plataformas
Parámetros de  Perforación y Voladura. para PlataformasParámetros de  Perforación y Voladura. para Plataformas
Parámetros de Perforación y Voladura. para Plataformas
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
Conservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de AlmeríaConservatorio de danza Kina Jiménez de Almería
Conservatorio de danza Kina Jiménez de Almería
 

Árboles y grafos

  • 1. 12007-2008, Módulo 4 Módulo 4 TDAs Contenedores Complejos 22007-2008, Módulo 4 Objetivos ● Comprender el concepto de árbol ● Conocer la terminología y las formas de recorrer el contenido de un árbol ● Conocer las especificaciones de los TDAs tree y bintree ● Manejar los ABB, APO, AVL ● Introducir el concepto de grafo y su especificación 32007-2008, Módulo 4 TDAs Contenedores Complejos Árboles 42007-2008, Módulo 4 Árboles Es una estructura jerárquica: ● Para cada elemento no hay tan sólo un anterior y un siguiente. ● Existen elementos por encima (padres) y por debajo (hijos). 52007-2008, Módulo 4 Árbol: Definición recursiva Un árbol T es un conjunto de nodos que almacenan elementos mediante una relación padre-hijo con la siguiente propiedad: ● Un nodo es un árbol. ● Un árbol vacío (con cero nodos) también es un árbol. ● Si tomamos N árboles y cada una de sus raíces las hacemos hijo de un nodo, el resultado también es un árbol. 62007-2008, Módulo 4 Terminología ● Existe una relación entre nodos en la que el nodo que está por encima se llama padre y el de abajo hijo. ● Nodo raíz es el único nodo que no tiene padre. ● Nodo hoja es aquel que no tiene hijos. ● Dos nodos que son hijos de un mismo nodo se llaman hermanos. Pueden estar ordenados de izquierda a derecha y en ese caso diremos que tenemos un árbol ordenado. ● Un nodo v es ancestro de un nodo n si se puede llegar desde n hasta v siguiendo la relación padre.
  • 2. 72007-2008, Módulo 4 Terminología (2) ● Un nodo v es descendiente de un nodo n si se puede llegar desde n hasta v siguiendo los hijos. ● Un nodo n es un interior si tiene hijos. ● Un nodo n es un exterior si no tiene hijos (hoja). ● Un nodo puede contener información, a la que se llama etiqueta del nodo. ● Un árbol etiquetado es aquél cuyos nodos poseen etiquetas. ● La profundidad de un nodo es el número de relaciones padre que hay que seguir para llegar desde ese nodo hasta el nodo raíz. La raíz tiene profundidad cero. 82007-2008, Módulo 4 Terminología (3) ● Un nivel consiste en el conjunto de nodos que se encuentran a la misma profundidad. ● La altura de un nodo es el número de relaciones hijo que hay que seguir hasta alcanzar su descendiente hoja más lejano. Una hoja tiene altura cero. ● La altura de un árbol es la altura de su nodo raíz. ● Tenemos un subárbol de un árbol si cogemos un nodo y todos sus descendientes. ● Un árbol parcial de un árbol es un árbol que tan sólo tiene algunos de los nodos del árbol original 92007-2008, Módulo 4 Terminología (4) ● Un subárbol parcial es un subárbol del que no tenemos todos sus descendientes. ● En los árboles generales no hay un número máximo de hijos por nodo. – Si el número máximo de hijos por nodo es 2 diremos que el árbol es binario, – si es tres, ternario, – ... – y en general n-ario. ● Un árbol se dice ordenado si se establece un orden lineal entre los hijos de cada nodo (1º, 2º, 3º, ...) 102007-2008, Módulo 4 Ejemplo 1 ● Un documento estructurado (libro) se organiza jerárquicamente como un árbol ordenado cuyos nodos internos son los capítulos, secciones y subsecciones y cuyos nodos externos son los párrafos. 112007-2008, Módulo 4 Ejemplo 2 ● Una expresión aritmética se puede representar como un árbol cuyos nodos externos son variables o constantes y cuyos nodos internos son operadores (+,*,/,-). ● Cada nodo de árbol tiene asociado un valor: – Si es externo, el que indica la variable o constante – Si es interno, el valor se determina al aplicar las op. para cada uno de sus hijos. e = -2 a = 3 3 6 2 8 122007-2008, Módulo 4 Otros Ejemplos ● Jerarquía de clases (directorio de yahoo) ● Árbol de sintaxis (estructura de una oración) ● Árbol genealógico ● Jerarquía Territorial (País, Comunidad Autónoma, Provincia, Municipio, ....) ● Estructura de una competición por eliminatorias. ● .......
  • 3. 132007-2008, Módulo 4 Tipo de Dato Árbol ● El TDA árbol almacena elementos en los nodos de éste. Así, un nodo de un árbol se puede ver como el equivalente a una posición del TDA list. 142007-2008, Módulo 4 Tipo de Dato Árbol (2) ● Tenemos TDA tree y TDA node – node root() const; Devuelve la raíz del árbol; – bool is_root(node v) const; Devuelve true si v es la raíz del árbol, falso en caso contrario; – bool is_internal(node v) const; Verdadero si el nodo es interno, false en caso contrario – bool is_external(node v) const; Verdadero si el nodo es externo, false en caso contrario – size_type size() const ; devuelve en número de nodos de un árbol. – ...... 152007-2008, Módulo 4 TDA node ● Dado un nodo, un TDA nodo debe presentar métodos que permita movernos por el árbol. – node parent() const; devuelve el padre del nodo en el árbol o nodo nulo si es la raíz del árbol. – node left() const; devuelve el hijo izquierda en el árbol, o nodo nulo si no tiene. – node next_sibling() const; devuelve el hermano derecha en el árbol, o nodo nulo no tiene. – T & operator*(); devuelve la etiqueta del nodo (también existe la versión constante const T& operator*() const) - bool null() const; devuelve si el nodo es nulo (no confundir con que valga NULL!!) 162007-2008, Módulo 4 Moviéndonos por un árbol int profundidad(const tree<T> & A, const  typename tree<T>::node &v) {   int prof = 0;   while (!A.is_root(v)) {     prof++;     v = v.parent();   }   return prof; } 172007-2008, Módulo 4 Moviéndonos por un árbol (2) ● Altura del nodo v: (Máxima profund. de un nodo externo) Definición recursiva: – Si v es externo, la altura es 0. – En otro caso, uno más la máxima altura de los hijos de v. 182007-2008, Módulo 4 Moviéndonos por un árbol (3) ● Implementación (Orden O(n)) int altura(const tree<T> & A, const  typename tree<T>::node &v) {    if (A.is_external(v)) return 0;      else {         int alt = 0;          tree<T>::node aux;         for (aux = v.left(); !aux.null();             aux = aux.next_sibling())             alt = max(alt,altura(A,aux));         return 1+alt; }  }
  • 4. 192007-2008, Módulo 4 Recorridos ● Mecanismo por el cual podemos visitar (acceder) todos los nodos de un árbol. ● No existe un único criterio. – Preorden: Visitar primero la raíz y luego visitar en preorden cada uno de los subárboles que son “hijos” del nodo raíz – Postorden: Visitar primero en postorden cada uno subárboles “hijos” del nodo raíz y finalmente visitar la raíz 202007-2008, Módulo 4 Recorridos (2) – Inorden: Visitar primero en inorden el subárbol izquierdo, después la raíz y después en inorden el resto de los hijos. – En anchura: Visitar en orden los nodos de profundidad 0, después los de profundidad 1, profundidad 2, .... 212007-2008, Módulo 4 Preorden Visitar primero la raíz y luego visitar en preorden cada uno de los subárboles que son “hijos” del nodo raíz 222007-2008, Módulo 4 Algoritmo preorden, O(n) void preorden(const tree<T> & A, const typename  tree<T>::node &v) {    typename tree<T>::node aux;   if (!v.null()) {        cout << *v;   //  acción sobre el nodo v.      for (aux = v.left(); !aux.null();          aux = aux.next_sibling())            preorden(A, aux);   } } ● Produce un orden lineal de los nodos donde un nodo aparece antes que los hijos. ● Si A es un documento estructurado, entonces preorden(A, A.root()) examina el documento secuencialmente, del principio al final. 232007-2008, Módulo 4 Postorden Visitar primero en postorden cada uno subárboles “hijos” del nodo raíz y finalmente visitar la raíz 242007-2008, Módulo 4 Algoritmo postorden, O(n) void postorden(const tree<T> &A, const typename  tree<T>::node &v) {    typename tree<T>::node aux;    if (!v.null ()) {       for (aux = v.left(); !aux.null();          aux =aux.next_sibling())          postorden(A, aux);         cout << *v;   //  acción sobre el nodo v.    } } ● Produce un orden lineal de los nodos donde un nodo aparece después  que los hijos. ● Si A es un árbol de directorios donde los nodos externos representan  los ficheros, entonces  postorden(A, v) nos permite conocer el espacio  de disco ocupado por  v.
  • 5. 252007-2008, Módulo 4 Inorden Visitar primero en inorden el subárbol izquierdo, después la raíz y después en inorden el resto de los hijos. 262007-2008, Módulo 4 Algoritmo inorden, O(n) void inorden(const tree<T> & A, const typename  tree<T>::node &v) {   typename tree<T>::node aux;    if (!v.null()) {       aux = v.left();       if (!aux.null())          inorden(A, v.left());       cout << *v;   //  acción sobre el nodo v.       while (!aux.null()) {          aux = aux.next_sibling())          inorden(A,aux);       }    } } ● Es de especial interés para árboles binarios, en particular, los ordenados. 272007-2008, Módulo 4 Árboles de Expresión y Recorridos ● Tanto la expresión en prefijo como en postfijo permiten recuperar unívocamente el árbol de expresión. ● La expresión en infijo sólo lo permite si está parentizada. 282007-2008, Módulo 4 Por Niveles o anchura Visitar en orden los nodos de profundidad 0, después los de profundidad 1, profundidad 2, .... 292007-2008, Módulo 4 Algoritmo Niveles, O(n) void Niveles(const tree<T> & A, const typename  tree<T>::node &v) {   typename tree<T>::node aux;   queue<tree<T>::node> Cola;   if (!v.null()) {      Cola.push(v);      while ( !Cola.empty() ) {          aux = Cola.front();         cout << *aux; // acción sobre el nodo v.         for (aux=aux.left(); !aux.null();            aux=aux.next_sibling())            Cola.push(aux);         Cola.top();      }   } }   302007-2008, Módulo 4 Árboles Binarios ● Un árbol binario es un árbol ordenado en el que cada nodo interno tiene como máximo dos hijos. Sea A un árbol propio (todos los nodos internos tienen 2 hijos), n el número de nodos y h su altura, entonces – Un nivel (profundidad) d tiene como máximo 2d nodos – h+1 <= número de nodos externos <= 2h – h<= número de nodos internos <= (2h ) -1 – 2h+1 <= n <= 2^(h+1) -1 – log(n+1) -1 <= h <= (n-1)/2 – El número de nodos externos es 1 más que el número de nodos internos
  • 6. 312007-2008, Módulo 4 Árboles binarios ● Es necesaria una subclase interna node para poder movernos por el árbol. ● Qué debe tener todo nodo: – constructor por defecto: node(); – constructor que crea un nodo con etiqueta e: node(const T& e); – determina si el receptor es el nodo nulo: bool null() const; – devuelve el nodo padre de un nodo receptor no nulo: node parent() const; – devuelve el nodo hijo a la izquierda de un receptor no nulo: node left() const; 322007-2008, Módulo 4 Árboles binarios (2) ● Qué debe tener todo nodo: – devuelve el nodo hijo a la derecha de un receptor no nulo: node right() const; – devuelve la etiqueta de un nodo receptor no nulo: T& operator*() const; – elimina el contenido de un nodo receptor no nulo, convirtiéndolo en el nodo nulo: void erase(); – asigna al receptor el contenido de un nodo a: node& operator=(const node& a); – determina si un nodo a es igual al receptor: bool operator==(const node& a) const; 332007-2008, Módulo 4 Árboles binarios (3) ● Qué debe tener todo nodo: – determina si un nodo a es distinto al receptor: bool operator!=(const node& a) const; 342007-2008, Módulo 4 Árboles Binarios (5) /** TDA bintree. Representa un árbol binario con nodos etiquetados con datos del tipo T, que debe tener definidas las operaciones: ● T & operator=(const T & e); ● bool operator!=(const T & e); ● bool operator==(const T & e); Exporta tipos: node, preorder_iterator, postorder_iterator, inorder_iterator, level_iterator y sus versiones const Son mutables y residen en memoria dinámica. */ 352007-2008, Módulo 4 Árboles Binarios (6) ● Qué métodos debe tener: – el constructor por defecto: bintree(); – el constructor con un nodo raíz de etiqueta e: bintree(const T& e); – el constructor de copia: bintree(const bintree<T> &A); – asignación al receptor de un subárbol de otro árbol A, subárbol que empieza en el nodo n: assign_subtree(const bintree<T> &A, bintree<T>::node &n); 362007-2008, Módulo 4 Árboles Binarios (7) ● Qué métodos debe tener: – el destructor: ~bintree(); – el operador de asignación, que asigna a un receptor una copia del contenido de otro árbol A, destruyendo previamente el contenido del receptor: bintree<T>& operator= (const bintree<T>& A); – el acceso al nodo raíz de un receptor: node root () const; – el método que poda todo el subárbol izquierdo de un nodo dado (es decir, el subárbol que tiene al hijo izquierdo de un nodo dado como raíz), devolviendo dicho subárbol y eliminándolo del receptor: void prune_left (bintree<T>::node n, bintree<T>& dest);
  • 7. 372007-2008, Módulo 4 Árboles Binarios (8) ● Qué métodos debe tener: – el método que poda todo el subárbol derecho de un nodo dado (es decir, el subárbol que tiene al hijo derecho de un nodo dado como raíz), devolviendo dicho subárbol y eliminándolo del receptor: void prune_right (typename bintree<T>::node n, bintree<T>& dest); – el método que cuelga un árbol branch como subárbol izquierdo de un nodo n y anula el árbol branch: void insert_left (typename bintree<T>::node n, bintree<T>& branch); – el método que cuelga un árbol branch como subárbol derecho de un nodo n y anula el árbol branch: void insert_right (typenamebintree<T>::node n, bintree<T>& branch); 382007-2008, Módulo 4 Árboles Binarios (9) ● Qué métodos debe tener: – destruye todos los nodos del receptor convirtiéndolo en el árbol nulo: void clear (); – calcula el tamaño del receptor en número de nodos: size_type size () const; – especifica si un árbol es el árbol nulo: bool null () const; – determina si el receptor es igual a otro árbol a que se le pasa: bool operator== (const bintree<T>& a) const; – determina si el receptor es distinto a otro árbol a que se le pasa: bool operator!= (const bintree<T>& a) const; 392007-2008, Módulo 4 Ejemplos de Uso (I) bool esHoja(const bintree<T> & A, const  typename bintree<T>::node &v) { return ( v.left().null()  &&                v.right().null() ); } bool esInterno(const bintree<T> & A,  const typename bintree<T>::node &v) { return ( !v.left().null() ||                !v.right().null() ); } 402007-2008, Módulo 4 Ejemplos de Uso (II): Recorrido Preorden void PreordenBinario(const bintree<T> & A, typename bintree<T>::node v){   if (!v.null()) {        cout << *v; // acción sobre el nodo v.        PreordenBinario(A, v.left());        PreordenBinario(A, v.right());   } } 412007-2008, Módulo 4 Ejemplos de Uso (III): Recorrido Inorden void InordenBinario(const bintree<T> & A,  typename bintree<T>::node v) {    if (!v.null()) {        InordenBinario(A, v.left());        cout << *v; //acción sobre el nodo v.        InordenBinario(A, v.right());   } } 422007-2008, Módulo 4 Ejemplos de Uso (IV): Recorrido Postorden void PostordenBinario(const bintree<T> & A,  typename bintree<T>::node v) {    if (!v.null()) {        PostordenBinario(A, v.left());        PostordenBinario(A, v.right());        cout << *v; // acción sobre el nodo v.   } }
  • 8. 432007-2008, Módulo 4 Ejemplos de Uso (V): Recorrido por Niveles void ListarPostNiveles(const bintree<T> &A,   typename bintree<T>::node n) {   queue<bintree<T>::node> nodos;   if (!n.null()) {     nodos.push(n);     while (!nodos.empty()) {       n = nodos.front(); nodos.pop();       cout << *n;       if (!n.left().null()) nodos.push(n.left());       if (!n.right().null())  nodos.push(n.right());     }   } } 442007-2008, Módulo 4 #include <iostream> #include "bintree.h" using namespace std; int main() {  // Creamos el árbol:   //        7   //     /       //    1      9   //  /      /   // 6    8  5   //          //       4 Ejemplos de Uso (VI) 452007-2008, Módulo 4 Construimos el árbol... typedef bintree<int> bti; bintree<int> Arb(7); Arb.insert_left(Arb.root(), bti(1)); Arb.insert_right(Arb.root(), bti(9)); Arb.insert_left(Arb.root().left(), bti(6)); Arb.insert_right(Arb.root().left(), bti(8)); Arb.insert_right(Arb.root().left().right(),  bti(4)); Arb.insert_left(Arb.root().right(), bti(5)); 462007-2008, Módulo 4 Iteradores para árboles De acuerdo a los cuatro recorridos definidos sobre árboles binarios, se precisan cuatro iteradores: ● preorder_iterator: itera sobre los nodos recorridos en preorden, ● postorder_iterator: itera sobre los nodos recorridos en postorden, ● inorder_iterator: itera sobre los nodos recorridos en inorden, ● level_iterator: itera sobre los nodos recorridos por niveles. 472007-2008, Módulo 4 Recorrido en PreOrden typename bintree<T>::preorder_iterador  it_p;   for (it_p= Arb.begin_preorder();        it_p!=Arb.end_preorder(); ++it_p)      cout << *it_p << " ";   cout << endl; 482007-2008, Módulo 4 Recorrido en PostOrden   for (typename  bintree<T>::postorder_iterator     i = Arb.begin_postorder();     i != Arb.end_postorder();     ++i)     cout << *i << " ";   cout << endl;
  • 9. 492007-2008, Módulo 4 Recorrido en InOrden   for (typename  bintree<T>::inorder_iterator i =  Arb.begin_inorder(); i != Arb.end_inorder(); ++i)     cout << *i << " ";   cout << endl; 502007-2008, Módulo 4 Recorrido por Niveles   for (typename  bintree<T>::level_iterator i = Arb.begin_level();     i != Arb.end_level();     ++i)     cout << *i << " ";   cout << endl; 512007-2008, Módulo 4 Módulo 4 Árboles Binarios de Búsqueda (BST) Árboles Equilibrados (AVL) Árboles Parcialmente Ordenados (POT) 522007-2008, Módulo 4 Árboles binarios de búsqueda: Motivación La búsqueda binaria es un proceso rápido de búsqueda de elementos en un vector ordenado O(log(n)). Sin embargo, las inserciones y borrados son muy ineficientes (O(n)). Los BST son de utilidad para representar TDAs donde las operaciones de búsqueda, inserción y borrado sean eficientes, además de permitir acceder a los elementos de forma ordenada. 532007-2008, Módulo 4 BST: Definición. Árbol Binario de Búsqueda (BST): árbol binario que verifica que: ● todos los elementos almacenados en el subárbol izquierdo de un nodo n son menores que el elemento almacenado en n, ● todos los elementos del subárbol derecho de n son mayores que el elemento almacenado en n. 542007-2008, Módulo 4 BST: Propiedades ● Son árboles binarios en los que para cada nodo se cumple que: – Tanto su hijo a la izquierda como los descendientes de éste tienen una etiqueta menor que la del nodo. – Tanto su hijo a la derecha como los descendientes de éste tienen una etiqueta mayor que la del nodo ● Es un tipo de dato orientado a búsqueda, es decir, que tan sólo tiene operaciones para crear, destruir, insertar etiquetas, borrar etiquetas y buscar etiquetas (aparte de un iterador)
  • 10. 552007-2008, Módulo 4 – Si el árbol está equilibrado, las operaciones de inserción, búsqueda y borrado de un elemento se pueden realizar en orden O(log(n)) – El recorrido en inorden da el conjunto de etiquetas ordenado BST: Propiedades (2) 562007-2008, Módulo 4 BST: Ejemplo 572007-2008, Módulo 4 /**  TDA BST::BST, insert, find, erase, size,  clear, empty, begin, end, ~BST  El TDA BST representa objetos que abstraen el  concepto de Árbol Binario de Búsqueda. Es un tipo  contenedor, cuyos componentes son Entradas  formadas por dos partes {clave, valor}, de tipos  Key y T, resp.  Los objetos Key deben tener las operaciones:  ­ bool operator<(const Key & c);  ­ bool operator==(const Key & c);  Los objetos T deben tener las operaciones:  ­ bool operator==(const T & c);   */ BST: Especificación bool operator<(const T & c); 582007-2008, Módulo 4 BST: Especificación (2) ● Qué métodos debe tener: – el constructor por defecto: BST(); – modificador que inserta o actualiza una entrada entrada de clave especificada dentro del BST: void insert(const pair<Key, T> & entrada); – método que busca un valor de clave clave específico dentro del BST y devuelve un iterador que lo contiene (si no está, devuelve end()): iterator find(const Key & clave); – método que devuelve el número de entradas del BST: size_type size() const; – modificador que elimina todas las entradas del receptor: void clear(); 592007-2008, Módulo 4 BST: Especificación (3) ● Qué métodos debe tener: – método que indica si el receptor está vacío: bool empty() const; – método que devuelve la posición dela primera entrada del BST: iterator begin() const; – método que devuelve la posición siguiente a la última entrada del BST receptor: iterator end() const; – destructor que libera todos los recursos asociados al BST receptor: ~BST(); 602007-2008, Módulo 4 BST::iterator : especificación ● Qué métodos debe tener: – Método que devuelve el par (clave, dato) que contiene la posición del iterador (que no puede estar en la posición end): pair<Key, T> operator*() const; – método que avanza el iterador a la siguiente posición del BST: void operator++ ();
  • 11. 612007-2008, Módulo 4 Ejemplo Uso BST   BST<string, string> arb;   string palabras[NUM] = {"piedra", "tiza",... };   string definiciones[NUM] = {"objeto muy duro",         "objeto muy blando", ...};     for (int i= 0; i<NUM; i++)      arb.insert(pair<string,string>(palabras[i],        definiciones[i]));     cout << "Num.datos: " << arb.size();   BST<string, string>::iterator i;   for (i = arb.begin(); i != arb.end(); ++i)      cout << (*i).first << ": " << (*i).second << endl; 622007-2008, Módulo 4 Ejemplo Uso BST: Ordenación template <class T> void ordenar(T v[], int num_datos) {   int i;   BST<T,char> abb;   for (i = 0; i < num_datos; i++)     abb.insert(pair<T,char>(v[i], ''));   BST<T,char>::iterator ite;   for (ite = abb.begin(), i = 0;      ite != abb.end(); ++ite, i++)         v[i] = (*ite).first; } 632007-2008, Módulo 4 Arbol Equilibrados: AVL Motivación: ● Las operaciones de Búsqueda, Inserción y Borrado en un BST genérico son de orden O(altura(arbol)) !!! Arboles Equilibrados Altura (arbol) es de O(log(n)) 642007-2008, Módulo 4 Arboles AVL BST Equilibrado donde las operaciones de búsqueda e inserción y borrado tienen un orden de eficiencia logarítmico. para cada nodo se cumple que: la diferencia de la altura de sus dos hijos es menor que uno (en valor absoluto). ● La especificación coincide con la del BST ● La implementación varía en las operaciones que modifican la altura de un nodo: insertar y borrar. 652007-2008, Módulo 4 Inserción en AVL (I) 662007-2008, Módulo 4 Inserción en AVL (II)
  • 12. 672007-2008, Módulo 4 Arbol parcialmente ordenado ● Son árboles equilibrados que permiten obtener el mínimo de un conjunto de datos de forma eficiente O(log_2 n) ● Cuando se añade un elemento siempre se hace lo más a la izquierda posible en el nivel que no esté completo, y si el nivel está completo como el elemento más a la izquierda en el siguiente nivel. ● Son las estructuras utilizadas en las colas con prioridad 682007-2008, Módulo 4 Ejemplo POT 4 5 2 5 68 1 0 1 0 692007-2008, Módulo 4 POT: Especificación ● Qué métodos debe tener: – el constructor por defecto: POT(int tam); – el constructor de copia: POT (const POT<T> &copiado); – método que devuelve el número de entradas del POT: size_type size() const; – método que devuelve el elemento más pequeño del receptor (que debe tener al menos un elemento): T min() const; – método que inserta el elemento elem en el receptor: void insert (const T& elem); – método que elimina un elemento de etiqueta elem en el receptor (si existe más de uno, borra uno de ellos): void erase (const T& elem); 702007-2008, Módulo 4 POT: inserción 1 0 8 5 4 2 5 1 0 6 1 1 0 5 4 2 5 1 0 61 8 1 0 5 2 5 1 0 6 8 1 4 1 0 5 5 1 0 6 8 4 1 2 712007-2008, Módulo 4 POT: Borrado 4 5 2 5 68 1 0 1 0 8 5 54 1 0 61 0 8 5 5 4 1 0 61 0 8 5 4 5 1 0 61 0 722007-2008, Módulo 4 TDAs Contenedores Complejos Grafos
  • 13. 732007-2008, Módulo 4 TDA Grafo Sea un conjunto de puntos, . ● Un grafo es un par ,con . ● Los elementos de se llaman nodos o vértices. ● Supondremos ● Los elementos de se llaman lados. 742007-2008, Módulo 4 TDA Grafo ● Un grafo se dice dirigido cuando el orden de los componentes de los pares de es relevante: . Sus lados denominan arcos. ● Un grafo se dice no dirigido cuando el orden de los componentes de los pares de no es relevante. Sus lados se llaman aristas. 752007-2008, Módulo 4 Conceptos sobre grafos ● Camino: dados se dice que existe un camino entre y si existe una secuencia de pares de : ● Se llama longitud del camino al número de pares. ● Un camino de a es un ciclo sii ● Un camino se dice simple cuando en él no hay ciclos. 762007-2008, Módulo 4 Conceptos sobre grafos ● Dados se dice que es adyacente a si . ● Casos particulares importantes de grafos: – Grafos dirigidos acíclicos (GDA). – Arboles. (Grafos conexos acíclicos). 772007-2008, Módulo 4 Recorridos en grafos ● La resolución eficiente de muchos problemas relacionados con grafos dirigidos requiere realizar la visita sistemática de los vértices y/o arcos ● Existen dos recorridos principales, que son base de muchos algoritmos: búsqueda en profundidad y búsqueda en anchura. 782007-2008, Módulo 4 Recorrido en profundidad ● Se trata de una generalización del recorrido en preorden de un árbol. enum { VISITADO, NO_VISITADO } Estado; Estado marca[n]; RecorridoProfundidad() {   para v de V     marca[v] = NO_VISITADO;   para v de V     si marca[v] == NO_VISITADO       rp(v); } rp(v) {   marca[v] = VISITADO;   para cada w adyacente a v     si marca[w] == NO_VISITADO       rp(w); }
  • 14. 792007-2008, Módulo 4 Recorrido en profundidad(2) Registro del recorrido en profundidad: ● Numeración en preorden: Asignar a cada vértice un número según el orden en que se visita. Añadir al principio de rp(v). nump = nump + 1 prenump[v] = nump ● Numeración en postorden: Asignar a cada nodo un número después de haber visitado todos sus nodos adyacentes. Añadir al final de rp(v). nump = nump + 1 postump[v] = nump 802007-2008, Módulo 4 Recorrido en profundidad:ejemplo 812007-2008, Módulo 4 Recorrido en anchura ● La idea es visitar un nodo, después intentar visitar un vecino de éste, luego un vecino de este vecino, y así sucesivamente. Es una generalización del recorrido por niveles de un árbol. ● Se usa, principalmente, para explorar parcialmente grafos infinitos o para encontrar el camino mínimo entre dos puntos. RecorridoAnchura() {   para cada v de V     marca[v] = NO_VISITADO   para cada v de V     si marca[v] == NO_VISITADO       ra(v) } 822007-2008, Módulo 4 Recorrido en anchura(2) ra(vertice v) {   Cola<vertice> c;   marca[v] = VISITADO;   c.insertar(v);   mientras (no c.vacia()) {     u = c.cabeza();     c.sacar();     para cada w adyacente a u {       si marca[w] `== NO_VISITADO         marca[w] = VISITADO         c.insertar(w);     }   } }