Professional Documents
Culture Documents
Curso 2018/2019
Árbol General
“ Un árbol general es o bien vacı́o o bien tiene dos componentes: (1) un
nodo raı́z que contiene un elemento, y (2) un conjunto de cero o más
(sub)árboles hijos.”
2 3
4 5 6 7 8
2 3
4 5 6 7 8
2 3
4 5 6 7 8
Nodos internos 9
2 3
4 5 6 7 8
2 3
4 5 6 7 8
Subárbol 9
2 3
4 5 6 7 8
Ancestros de 5 9
2 3
4 5 6 7 8
Descendientes de 3 9
2 3
4 5 6 7 8
2 nodos hermanos 9
2 3
4 5 6 7 8
Arista 9
2 3
4 5 6 7 8
2 3
4 5 6 7 8
2 3
4 5 6 7 8
Camino 9
2 3
4 5 6 7 8
2 3
4 5 6 7 8
2 3
4 5 6 7 8
Nivel 2 9
...
}
...
public Iterable < Position <E > > children ( Position <E > p ) ;
}
Ejemplo
Método que indica si un nodo es ancestro de otro
if ( w == v ) return true ;
if ( tree . isRoot ( v ) ) return false ;
return esAncestro ( tree ,w , tree . parent ( v ) ) ;
}
Ejemplo
Método que indica si un nodo es hermano de otro
Ejemplo
Método que indica si un nodo es hermano de otro
Ejemplo
Método que calcula la profundidad de un nodo de un árbol dado
(recursivo)
Ejemplo
Método que recorre un árbol en anchura
P o s i t i o n <E> a d d C h i l d F i r s t ( P o s i t i o n <E> p a r e n t P o s , E e ) ;
P o s i t i o n <E> a d d C h i l d L a s t ( P o s i t i o n <E> p a r e n t P o s , E e ) ;
P o s i t i o n <E> i n s e r t S i b l i n g B e f o r e ( P o s i t i o n <E> s i b l i n g P o s , E e ) ;
P o s i t i o n <E> i n s e r t S i b l i n g A f t e r ( P o s i t i o n <E> s i b l i n g P o s , E e ) ;
v o i d r e m o v e S u b t r e e ( P o s i t i o n <E> p ) ;
}
P o s i t i o n <I n t e g e r > n2 = t r e e . a d d C h i l d L a s t ( t r e e . r o o t ( ) , 2 ) ;
P o s i t i o n <I n t e g e r > n3 = t r e e . a d d C h i l d L a s t ( t r e e . r o o t ( ) , 3 ) ;
P o s i t i o n <I n t e g e r > n4 = t r e e . a d d C h i l d L a s t ( n2 , 4 ) ;
P o s i t i o n <I n t e g e r > n6 = t r e e . a d d C h i l d L a s t ( n2 , 6 ) ;
P o s i t i o n <I n t e g e r > n5 = t r e e . i n s e r t S i b l i n g B e f o r e ( n6 , 5 ) ;
P o s i t i o n <I n t e g e r > n7 = t r e e . a d d C h i l d L a s t ( n3 , 7 ) ;
P o s i t i o n <I n t e g e r > n8 = t r e e . i n s e r t S i b l i n g A f t e r ( n7 , 8 ) ;
P o s i t i o n <I n t e g e r > n9 = t r e e . a d d C h i l d L a s t ( n8 , 9 ) ;
Árbol Binario
“Un árbol binario es o bien vacı́o o bien consiste en (1) un nodo raı́z, (2)
un (sub)árbol izquierdo, y (3) un (sub)árbol derecho.”
o h = 0
2 h+1 -1 = 1
o h = 1
/ \ 2 h+1 -1 = 3
o o
o h = 2
/ \ 2 h+1 -1 = 7
o o
/ \ / \
o oo o
Es decir, un árbol en el que para todo nodo con altura h, o bien sus
dos hijos tienen la misma altura, h − 1, o un hijo tiene altura h − 1 y
el otro h − 2
Todo subárbol de un árbol equilibrado es también equilibrado
BinaryTree < Integer > tree = new LinkedBinaryTree < Integer >() ;
tree . addRoot (1) ;
Position < Integer > left = tree . insertLeft ( tree . root () , 2) ;
Position < Integer > right = tree . insertRight ( tree . root () , 3) ;
Position < Integer > n4 = tree . insertLeft ( left ,4) ;
Position < Integer > n5 = tree . insertRight ( left ,5) ;
Position < Integer > n6 = tree . insertLeft ( right ,6) ;
Ejemplo
Método que devuelve la altura de un árbol binario
int hi = 0 , hd = 0;
if ( tree . hasLeft ( v ) )
hi = height ( tree , tree . left ( v ) ) ;
if ( tree . hasRight ( v ) )
hd = height ( tree , tree . right ( v ) ) ;
return 1 + Math . max ( hi , hd ) ;
}
Ejemplo
Recorrido de un árbol binario en pre-orden y en post-orden
Ejemplo
Los árboles binarios también permiten el recorrido en in-orden
&&
|| &&
T F T T
Ejercicio
Imprimir la expresión contenida en un árbol con sus correspondientes
paréntesis
Ejercicio
Imprimir la expresión contenida en un árbol con sus correspondientes
paréntesis
Ejercicio
Evaluar la expresión booleana contenida en un árbol
Ejercicio
Evaluar la expresión booleana contenida en un árbol
switch ( v . element () ) {
case ’T ’ : return true ;
case ’ F ’ : return false ;
case ’ | ’ :
return eval (t , t . left ( v ) ) || eval (t , t . right ( v ) ) ;
case ’& ’ :
return eval (t , t . left ( v ) ) && eval (t , t . right ( v ) ) ;
default :
throw new IAE (”Nodo i n c o r r e c t o ” + t . element () ) ;
}
}
int eval ( BinaryTree < Character > t , Position < Character > v ) {
switch ( v . element () ) {
case ’+’ :
return eval (t , t . left ( v ) ) + eval (t , t . right ( v ) ) ;
case ’−’ :
return eval (t , t . left ( v ) ) - eval (t , t . right ( v ) ) ;
case ’ ∗ ’ :
return eval (t , t . left ( v ) ) * eval (t , t . right ( v ) ) ;
case ’/ ’ :
return eval (t , t . left ( v ) ) / eval (t , t . right ( v ) ) ;
default :
throw new IAE ( ”Elemento i n c o r r e c t o ” + v . element () ) ;
}
}