PDF de programación - Árboles - Programación de sistemas

Imágen de pdf Árboles - Programación de sistemas

Árboles - Programación de sistemasgráfica de visualizaciones

Actualizado el 16 de Enero del 2019 (Publicado el 4 de Enero del 2019)
1.063 visualizaciones desde el 4 de Enero del 2019
3,0 MB
77 paginas
Creado hace 5a (20/01/2015)
Programación de sistemas



Árboles

Julio Villena Román

<jvillena@it.uc3m.es>



MATERIALES CREADOS EN EL TRABAJO DE DIFERENTES AUTORES:

Carlos Delgado Kloos, M.Carmen Fernández Panadero,

Raquel M.Crespo García, Carlos Alario Hoyos

1

Contenidos

 Concepto de árbol
 Terminología
 Implementación
 Casos especiales

 Árboles binarios de búsqueda
 Montículos (heaps)

2

Cita

“The structure of concepts is formally


called a hierarchy and since ancient times has
been a basic structure for all Western
knowledge. Kingdoms, empires, churches,
armies have all been structured into
hierarchies. Tables of contents of reference
material are so structured, mechanical
assemblies, computer software, all scientific
and technical knowledge is so structured...”

Robert M. Pirsig:
Zen and the Art of Motorcycle Maintenance

3

Concepto de árbol

Un árbol es una estructura

de datos no lineal que

almacena los elementos

jerárquicamente



(generalización de las listas)

4

Ejemplos

1. Clasificación de la información en una

enciclopedia



5

Ejemplos

2. Sistema de ficheros



6

Ejemplos

3. Estructura organizativa de una empresa

4. Estructura de rangos del ejército

5. Estructura de un libro





7

Definición no recursiva

• Un árbol consiste en un conjunto de nodos

y un conjunto de aristas, de forma que:
o Se distingue un nodo llamado raíz

o A cada nodo h (hijo), excepto la raíz, le llega

una arista de otro nodo p (padre)

o Para cada nodo hay un camino (secuencia de

aristas) único desde la raíz

o Los nodos que no tienen hijos se denominan

hojas



8

Definición no recursiva



9

Definición recursiva

• Un árbol es:

o Vacío

o Un nodo y cero o más árboles conectados

al nodo mediante una arista



* A los árboles que se conectan al nodo raíz los denominaremos

también “subárboles”

10

Definición recursiva



11

Definición recursiva



12

Definición recursiva



13

Definición recursiva



14

Definición recursiva



15

Terminología

• Un nodo es externo, si no tiene hijos (es hoja)

o Según la definición recursiva: si todos los subárboles

conectados a ese nodo están vacíos

• Un nodo es interno, si tiene uno o más hijos

o Según la definición recursiva: si alguno de los subárboles

conectados a ese nodo no está vacío

• Un nodo es ascendiente de otro, si es padre suyo

o ascendiente de su padre

• Un nodo es descendiente de otro, si este último

es ascendiente del primero
o Los descendientes de un nodo forman un subárbol en el

que ese nodo hace de raíz



16

Terminología

• Un camino de un nodo a otro, es una secuencia de

aristas consecutivas que llevan del primero al
segundo

o La longitud del camino es el número de aristas

• La profundidad de un nodo es la longitud del

camino de la raíz a ese nodo

• La altura de un árbol es el valor de la

profundidad del nodo más profundo

• El tamaño de un árbol es el número de nodos

que contiene



17

Ejemplo



Nodo Altura Profundidad Tamaño



a

b

c

d

e

f

g

2

1

0

0

0

0

0

0

1

1

1

1

2

2

7

3

1

1

1

1

1

Int./Ext.
Interno

Interno

Externo

Externo

Externo

Externo

Externo

18

Ejercicio 1

• Completa la tabla para el siguiente árbol

Nodo Altura Profundidad Tamaño

a

b

c

d

e

f

g

h

i

j

k

3

1

0

1

2

0

0

0

0

1

0

0

1

1

1

1

2

2

2

2

2

3

11

3

1

2

4

1

1

1

1

2

1

Int./Ext.
Interno

Interno

Externo

Interno

Interno

Externo

Externo

Externo

Externo

Interno

Externo

19

Terminología: Árbol ordenado

• Un árbol es ordenado, si para cada nodo
existe un orden lineal para todos sus hijos



20

Terminología: Árbol binario

• Un árbol binario es un árbol ordenado en el

que cada nodo tiene 2 árboles (izquierdo y
derecho).
o Árbol binario según la definición recursiva de árbol

o

Los árboles izquierdo y/o derecho pueden estar vacíos



* En general, suponemos árboles binarios para simplificar

la implementación de los árboles



21

La interfaz BTree

public interface BTree<E> {

static final int LEFT = 0;
static final int RIGHT = 1;

boolean isEmpty();
E getInfo() throws BTreeException;
BTree<E> getLeft() throws BTreeException;
BTree<E> getRight() throws BTreeException;

void insert(BTree<E> tree, int side) throws BTreeException;
BTree<E> extract(int side) throws BTreeException;

String toStringPreOrder();
String toStringInOrder();
String toStringPostOrder();
String toString(); // preorder

int size();
int height();

boolean equals(BTree<E> tree);
boolean find(BTree<E> tree);
}


22

Una interfaz varias implementaciones

• Implementación basada en arrays



 Subárbol izquierdo

 Posición nodo raíz * 2

 Subárbol derecho

 Posición nodo raíz * 2 +1

23

Una interfaz varias implementaciones



Implementación basada en enlaces





Linked Binary Node (LBNode)
Linked Binary Tree (LBTree)

 Cada árbol (LBTree) tiene un nodo raíz (atributo LBNode)
 Cada nodo raíz LBNode apunta a dos árboles (atributos LBTree), los

cuales pueden estar vacíos (null)



24

La clase LBNode

public class LBNode<E> {

private E info;
private BTree<E> left;
private BTree<E> right;

public LBNode(E info, BTree<E> left, BTree<E> right) {…}
public E getInfo() {…}
public void setInfo(E info) {…}
public BTree<E> getLeft() {…}
public void setLeft(BTree<E> left) {…}
public BTree<E> getRight() {…}
public void setRight(BTree<E> right){…}
}

25

Ejercicio 2

• Completa la implementación de

la clase LBNode.

26

La clase LBTree


public class LBTree<E> implements BTree<E> {

private LBNode<E> root;

public LBTree() {
root = null;
}

public LBTree(E info) {
root = new LBNode<E>(info, new LBTree<E>(), new LBTree<E>());
}

public boolean isEmpty() {
return (root == null);
}


27

La clase LBTree


public E getInfo() throws BTreeException {
if (isEmpty()) {
throw new BTreeException("empty trees do not have info");
}
return root.getInfo();
}

public BTree<E> getLeft() throws BTreeException {
if (isEmpty()) {
throw new BTreeException("empty trees do not have a left child");
}
return root.getLeft();
}

public BTree<E> getRight() throws BTreeException {
if (isEmpty()) {
throw new BTreeException("empty trees do not have a right child");
}
return root.getRight();
}


28

Algoritmos básicos

• Tamaño: size()
• Altura: height()
• Recorridos

o Pre-orden: toStringPreOrder()
o In-orden: toStringInOrder()
o Post-orden: toStringPostOrder()



29

La clase LBTree: size()


public int size() {
if (isEmpty()) {
return 0;
} else {
return 1 + root.getLeft().size()
+ root.getRight().size();
}
}

30

La clase LBTree: height()


public int height() {
if (isEmpty()) {
return -1;
} else {
int leftHeight = root.getLeft().height();
int rightHeight = root.getRight().height();
if (leftHeight > rightHeight) {
return 1 + leftHeight;
} else {
return 1 + rightHeight;
}
}
}

1+Math.max(leftHeight,
rightHeight);

31

Recorrido de Euler

32

Recorrido Pre-orden

 Primero el nodo raíz
 Después sus hijos
(recursivamente)

33

La clase LBTree:

toStringPreOrder()

public String toStringPreOrder() {
if (isEmpty()) {
return "";
} else {
return root.getInfo().toString() + " " +
root.getLeft().toStringPreOrder() +
root.getRight().toStringPreOrder();
}
}

34

Recorrido Post-orden

 Primero los hijos
(recursivamente)

 Después el nodo raíz


35

La clase LBTree:

toStringPostOrder()

public String toStringPostOrder() {
if (isEmpty()) {
return "";
} else {
return root.getLeft().toStringPostOrder() +
root.getRight().toStringPostOrder() +
root.getInfo().toString() + " ";
}
}

36

Recorrido In-orden (simétrico)

 Primero el hijo izquierdo

(recursivamente)

 Después el nodo raíz
 Después el hijo derecho

(recursivamente)



37

La clase LBTree:

toStringInOrder()

public String toStringInOrder() {
if (isEmpty()) {
return "";
} else {
return root.getLeft().toStringInOrder() +
root.getInfo().toString() + " " +
root.getRight().toStringInOrder();
}
}

38

Ejercicio 3

• Dado el siguiente árbol binario, indica qué
recorrido (pre-orden, in-orden, post-orden)

produce el resultado (A+B)*(C-D).

39

Diferente notación matemática

Infix

A+B

Prefix

Postfix

+AB

AB+

A+B–C

–+ABC

AB+C–

(A+B)*(C–D)

*+AB–CD

AB+CD–*

40

Actividad

Expresiones matemáticas como árboles:
http://www.cs.jhu.edu/~goodrich/dsa/05trees/Demo1/

41

Programación de sistemas



Árboles (II)



Julio Villena Román

<jvillena@it.uc3m.es>



MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES:

Carlos Delgado Kloos, M.Carmen Fernández Panadero,

Raquel M.Crespo García, Carlos Alario Hoyos

42

Contenidos

 Concepto de árbol
 Terminología
 Implementación
 Casos especiales

 Árboles binarios de búsqueda
 Montículos (heaps)

43

Notación

• Hasta ahora:

o Un nodo, tres atributos: información almacenada,

subárbol izquierdo
  • Links de descarga
http://lwp-l.com/pdf14759

Comentarios de: Árboles - Programación de sistemas (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad