Está en la página 1de 20

Arboles y grafos

Equipo 4
Arboles
• Los Árboles se caracterizan por almacenar sus nodos en
forma jerárquica y no en forma lineal como las Listas
Ligadas, Colas,Pilas,etc.,.
Estructura arboles
• Nodos: Se le llama Nodo a cada elemento que contiene un Árbol.

• Nodo Raíz: Se refiere al primer nodo de un Árbol, Solo un nodo del Árbol
puede ser la Raíz.

• Nodo Padre: Se utiliza este termino para llamar a todos aquellos nodos que
tiene al menos un hijo.

• Nodo Hijo: Los hijos son todos aquellos nodos que tiene un padre.

• Nodo Hermano: Los nodos hermanos son aquellos nodos que comparte a
un mismo padre en común dentro de la estructura.
• Nodo Hoja: Son todos aquellos nodos que no tienen hijos, los cuales
siempre encuentran en los extremos de la estructura.

• Nodo Rama: Estos son todos aquellos nodos que no son la raíz y que
ademas tiene al menos un hijo.
• Nivel: 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 demás 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 demás generaciones.
• Un árbol vacío tiene 0 niveles
• El nivel de la Raíz es 1

• 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.
• Altura: Le llamamos Altura al número máximo de niveles de un Árbol. La
altura es calculado mediante recursividad tomando el nivel mas grande
de los dos sub-árboles de forma recursiva de la siguiente manera:
altura = max(altura(hijo1), altura(hijo2),altura(hijoN)) + 1

• Peso: 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.) 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
peso = peso(hijo1) + peso(hijo2) + peso(hijoN)+ 1
• Orden: El Orden de un árbol es el número máximo de hijos que puede tener
un Nodo.

• Grado: 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.
• 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.
• grado = max(contarHijos(hijo1),contarHijos(hijo2), contarHijos(hijoN),
contarHijos(this))
• Sub-Árbol: 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.

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.
• Profundidad
• Se define la profundidad de un nodo en un árbol como la longitud del
camino (único) que comienza en la raíz y termina en el nodo. También se
denomina nivel.

• La profundidad de la raíz es 0
• La profundidad de un nodo es igual a la profundidad de su padre + 1
Recorrido de Árboles
• Preorden: Se pasa por la raíz y luego se recorre en preorden cada uno de
los subárboles. Recursivo.
• Postorden: Se recorre en postorden cada uno de los subárboles y luego se
pasa por la raíz. Recursivo.
• Inorden: Se recorre en inorden el primer subárbol (si existe). Se pasa por
la raíz y por último se recorre en inorden cada uno de los subárboles
restantes. Tiene sentido fundamentalmente en árboles binarios.
Recursivo.
• Por Niveles: Se etiquetan los nodos según su profundidad (nivel). Se
recorren ordenados de menor a mayor nivel, a igualdad de nivel se
recorren de izquierda a derecha.No recursivo: Se introduce el raíz en una
cola y se entra en un bucle en el que se extrae de la cola un nodo, se
recorre su elemento y se insertan sus hijos en la cola.
Grafos
• consiste en un conjunto de nodos (también llamados
vértices) y un conjunto de arcos (aristas) que establecen
relaciones entre los nodos.
• La teoría de grafos nació con la finalidad de representar de
forma visual conjuntos abstractos de datos que se encuentran
en el mundo real para ser útiles en soluciones de problemas
de complejidad.
• Ha contribuido inclusive a la creación de una nueva forma de ver el
mundo. Ahora podemos comprender el mundo de los datos con imágenes.
• Decimos que dos nodos están conectados si podemos ir de uno a otro a
través de arcos:

• Si todos los nodos están conectados hablamos de grafo conexo.


Decimos que todos los nodos que están conectados entre sí forman
una componente conexa así pues los nodos verdes forman una
componente conexa y los nodos azules forman otra componente
conexa.
• Grado de un nodo: Es el número de aristas conectadas al nodo.

• Grafo dirigido: Grafo en el que los arcos tienen sentido. Si los arcos no
tienen sentido hablamos de un grafo no dirigido

Por ejemplo, este grafo es dirigido, mientras que los anteriores no lo


eran. En el contexto de grafos dirigidos, decimos que un conjunto de
vértices forman una componente fuertemente conexa si es posible ir de
un nodo cualquiera del conjunto a cualquier otro, en el ejemplo cada
una de las componentes conexas tiene asignada un color.
• Grafo ponderado (o con pesos): Grafo en el que las aristas
tienen un peso asociado

• Camino: Es un grafo en el que podemos nombrar a los


nodos de modo que dos nodos están conectados si y
solo si su diferencia es 1.
• Ciclo: Es un conjunto de nodos donde cada uno está
conectado al siguiente y el ultimo al primero. Es un grafo que
se asemeja a un polígono de n lados. No se repite ningún
vértice a excepción del primero que aparece dos veces como
principio y fin del camino.

• Grafo completo: Es un grafo en el que todo par


de vértices están conectados.
• Grafo bipartido: Grafo en el que podemos agrupar los vértices
en dos clases, de modo que no haya arcos entre los vértices
de una misma clase.

• Árbol: Grafo conexo y sin ciclos:

A un conjunto de árboles se le llama bosque. En determinadas


ocasiones podemos considerar que el árbol tiene un nodo
principal, en este caso hablamos de árbol arraigado, en este tipo
de árboles a los nodos adyacentes más alejados de la raíz se les
llama hijos, mientras que al nodo adyacente más cercano a la raíz
se le llama padre, finalmente, a los nodos sin hijos se les
llama hojas.
Los 3 modos más comunes de representar un
grafo son:
• Como conjunto de arcos, donde guardamos las parejas de vértices
conectados. En caso que el grafo sea ponderado se guardan tuplas:
los dos nodos conectados y su peso.

using namespace std;

int main() {
int n, m;
cin >> n >> m;

vector <vector <int> > arcos(m, vector <int>(3));

for (int i = 0; i < m; ++i){


cin >> arcos[i][0] >> arcos[i][1] >> arcos[i][2];
}
}
• Como matriz de adyacencia, donde por cada par de vértices
sabemos si hay un arco que los una o no. Si N es el tamaño del
grafo, se guarda una tabla G[N][N] donde la entrada G[v][u]
determina la información de la arista entre v y u.

using namespace std;

int main() {
int n, m;
cin >> n >> m;
vector <vector <int> > G(n, vector <int>(n, -1));

for (int i = 0; i < m; ++i){


int x, y, w;
cin >> x >> y >> w;

G[x][y] = G[y][x] = w;
}
}
• Como lista de adyacencia. Guardaremos una lista G[N], donde
cada entrada G[v] será una lista de los nodos adyacentes a v.
En C++, podemos representarlo como vector<vector<int> > G.
En caso de tener pesos, habrá que guardar también el peso de
la arista, usando por ejemplo pair<int, int>.
using namespace std;

int main() {
int n, m;
cin >> n >> m;

vector <vector <int> > G(n);


vector <vector <int> > W(n);

for (int i = 0; i < m; ++i){


int x, y, w;
cin >> x >> y >> w;

G[x].push_back(y);
G[y].push_back(x);
W[x].push_back(w);
W[y].push_back(w);
}
}
Conclusion
• Los arboles y grafos son conceptos muy importantes en la
programación y en otras áreas ya que hace que visualices y te
des idea de la estructura de numeros,codigo,etc..

También podría gustarte