Vous êtes sur la page 1sur 24

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Arboles
Roberto Carlos Abreu Daz

October 28, 2009

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Arboles

Arboles
Binarios

Arboles
binarios Java
Codigo Java para b
usqueda

Insercion de un nodo
Codigo Java para inserci
on

Eliminacion de un nodo
Caso 1
Caso 2
Caso 3

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Arboles

Definicion
Un arbol consiste de nodos
conectados entre s por ejes.

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Terminologa
Camino: una secuencia de pasos para llegar desde un nodo A
hasta un nodo B.
Raz: es el nodo en el tope de un arbol, no tiene padre y solo
puede haber una raz.
Padre e hijo: si A y B estan conectados y B esta por encima
de A, B es el padre de A y A es el hijo de B.
Hoja: Es un nodo que no tiene hijos.
Sub-arbol: Cualquier nodo puede ser considerado la raz de un
sub-arbol.
Nivel: a cuantas generaciones un nodo esta de la raz.
Llave: campo de data.
Recorrido: visitar los nodos de un arbol en cierto orden.
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Arboles
Binarios
Definicion
Si cada nodo en un arbol puede tener a lo sumo dos hijos, el arbol
es llamado arbol binario. Los dos hijos de cada nodo se llaman hijo
izquierdo e hijo derecho. Los nombres corresponden a sus
posiciones al dibujarlos.
Nota
El tipo de arbol binario con el que estaremos trabajando se llama
arbol binario de b
usqueda. Estos se caracterizan porque el hijo
izquierdo de un nodo debe tener una llave menor que la de su
padre, y el hijo derecho de un nodo debe tener una llave mayor o
igual a su padre.
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para b
usqueda

Codigo Java para arboles binarios


c l a s s Node
{
i n t d a t a ; // l l a v e
p r i v a t e Node l e f t C h i l d ; // h i j o i z q u i e r d o
p r i v a t e Node r i g h t C h i l d ; // h i j o d e r e c h o
}
class BinaryTree {
p r i v a t e Node r o o t ; // r a z
// y l a s o p e r a c i o n e s c o r r e s p o n d i e n t e s . . .
}

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para b
usqueda

B
usqueda de un elemento

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para b
usqueda

B
usqueda de un elemento
Aprovecha el orden en que los nodos estan organizados para
buscar los elementos.

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para b
usqueda

B
usqueda de un elemento
Aprovecha el orden en que los nodos estan organizados para
buscar los elementos.
Como un nodo tiene a lo sumo un hijo izquierdo menor que el
y un hijo derecho mayor que el, el algoritmo se mueve
recursivamente por los sub-arboles hasta que encuentre el
nodo con la llave.
El dice: si estoy en un nodo y la llave no es la buscada,
si la llave buscada es menor entonces visita su hijo izquierdo.
De lo contrario, visita su hijo derecho.

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para b
usqueda

B
usqueda de un elemento
Aprovecha el orden en que los nodos estan organizados para
buscar los elementos.
Como un nodo tiene a lo sumo un hijo izquierdo menor que el
y un hijo derecho mayor que el, el algoritmo se mueve
recursivamente por los sub-arboles hasta que encuentre el
nodo con la llave.
El dice: si estoy en un nodo y la llave no es la buscada,
si la llave buscada es menor entonces visita su hijo izquierdo.
De lo contrario, visita su hijo derecho.

Consecuentemente, si aterriza a una direcci


on nula, esto
significa que el nodo buscado no existe en el arbol.

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para b
usqueda

Codigo Java para b


usqueda
p u b l i c Node f i n d ( i n t k e y ) {
Node c u r r = r o o t ;
w h i l e ( c u r r . d a t a != k e y ) {
i f ( key < c u r r . data )
curr = curr . leftChild ;
else
curr = curr . rightChild ;
i f ( c u r r == n u l l )
return n u l l ;
}
return c u r r ;
}
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para inserci
on

Insercion de un nodo

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para inserci
on

Insercion de un nodo
Para insertar un nodo, primero debemos averiguar donde
corresponde en el arbol. (Wao!)

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para inserci
on

Insercion de un nodo
Para insertar un nodo, primero debemos averiguar donde
corresponde en el arbol. (Wao!)
El codigo practicamente es el mismo que el de buscar un nodo
(no existente).
No existente porque en ese espacio libre es que se colocara el
nuevo nodo.

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para inserci
on

Codigo Java para inserci


on
p u b l i c v o i d i n s e r t ( Node newNode ) {
// E s t e e s e l c a s o base ,
// donde e l a r b o l e s t a v a co
i f ( r o o t == n u l l ) {
r o o t = newNode ;
return ;
}
// p a r t e dos en p r
oximo s l i d e

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

C
odigo Java para inserci
on

Codigo Java para inserci


on
Node c u r r = r o o t , p a r e n t ;
while ( true ) { parent = c u r r e n t ;
i f ( newNode . d a t a < c u r r . d a t a ) {
curr = curr . leftChild ;
i f ( c u r r == n u l l ) {
p a r e n t . l e f t C h i l d = newNode ; r e t u r n ;
}
} else {
curr = curr . rightChild ;
i f ( c u r r == n u l l ) {
p a r e n t . r i g h t C h i l d = newNode ; r e t u r n ;
}
}
}}
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

Eliminacion de un nodo

Acerca de la eliminaci
on
Hay varios casos a considerar al eliminar un nodo. Que hacer con
los hijos de ese nodo? Se distinguen tres casos base:
El nodo a eliminar es una hoja
El nodo a eliminar tiene un hijo
El nodo a eliminar tiene dos hijos
Todos sin embargo tienen algo en com
un: utilizan una funcion de
b
usqueda similar a las de buscar e insertar.

Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

CASO 1: el nodo es hoja


Es el caso mas sencillo
Simplemente se fija a null
el hijo apropiado del padre
de ese nodo
En Java, el Garbage
Collector se encarga del
resto
En este ejemplo, el nodo
con la llave 9 es el padre.
Se hara:
nodoPadre.rightChild =
null;
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

p u b l i c boolean d e l e t e ( i n t k e y ) {
Node c u r r = r o o t ;
Node p a r e n t = r o o t ;
boolean i s L e f t = t r u e ;
w h i l e ( c u r r . d a t a != k e y ) {
parent = curr ;
i f ( key < c u r r . data ){
i s L e f t = true ;
curr = curr . leftChild ;
}
else {
isLeft = false ;
curr = curr . rightChild ;
}
Roberto Carlos Abreu Daz

Arboles

i f ( c u r r == n u l l )
return f a l s e ;
} // end w h i l e
i f ( NoChild ( c u r r )){
i f ( c u r r == r o o t )
root = null ;
else i f ( i s L e f t )
parent . l e f t C h i l d =
null ;
else
parent . rightChild =
null ;
}

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

CASO 2: el nodo a eliminar tiene un hijo


Este caso es relativamente
sencillo tambien
El nodo tiene a lo sumo
dos conexiones:
Una con su padre y una
con su hijo
El objetivo es reemplazar
al nodo en el padre con su
hijo
O sea, si 9 se va a
eliminar, el objetivo es
fijar a 6 como el rightChild
de 4
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

// c o n t i n u a c i o n . . .
e l s e i f ( c u r r . r i g h t C h i l d == n u l l ) {
i f ( c u r r == r o o t ) r o o t = r o o t . l e f t C h i l d ;
else i f ( i s L e f t )
parent . l e f t C h i l d = curr . l e f t C h i l d ;
else
parent . rightChild = curr . l e f t C h i l d ;
e l s e i f ( c u r r . l e f t C h i l d == n u l l )
i f ( c u r r == r o o t ) r o o t = r o o t . r i g h t C h i l d ;
else i f ( i s L e f t )
parent . l e f t C h i l d = curr . rightChild ;
else
parent . rightChild = curr . rightChild ;
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

CASO 3: el nodo a eliminar tiene dos hijos


Si tiene, no se puede
reemplazar simplemente
con uno de sus hijos (por
lo menos cuando el hijo
tambien tiene hijos).
El objetivo es reemplazar
al nodo por su sucesor.
Especficamente, su
sucesor En-Orden.

Este
es el nodo mas
peque
no del conjunto de
nodos que son mayores
que el nodo a eliminar.
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

p r i v a t e node g e t S u c c e s s o r ( Node node ) {


Node p a r e n t = node , s u c c e s s o r = node ,
c u r r e n t = node . r i g h t C h i l d ;
w h i l e ( c u r r e n t != n u l l ) {
parent = successor ;
successor = current ;
current = currente . leftChild ;
}
i f ( s u c c e s s o r != node . r i g h t C h i l d ) {
parent . l e f t C h i l d = successor . rightChild ;
s u c c e s s o r . r i g h t C h i l d = node . r i g h t C h i l d ;
}
return s u c c e s s o r ;
}
Roberto Carlos Abreu Daz

Arboles

Outline

Arboles

Arboles
Binarios

Arboles
binarios Java
Inserci
on de un nodo
Eliminaci
on de un nodo

Caso 1
Caso 2
Caso 3

// c o n t i n u a c i o n
else {
Node s u c c e s s o r = g e t S u c c e s s o r ( c u r r e n t ) ;
i f ( c u r r == r o o t )
root = successor ;
else i f ( i s L e f t )
parent . l e f t C h i l d = successor ;
else
parent . rightChild = successor ;
successor . leftChild = curr . leftChild ;
}
return true ;
} // end d e l e t e

Roberto Carlos Abreu Daz

Arboles