Roberto Carlos Abreu D az October 28,...

24
Outline ´ Arboles ´ Arboles Binarios ´ Arboles binarios Java Inserci´ on de un nodo Eliminaci´ on de un nodo ´ Arboles Roberto Carlos Abreu D´ ıaz October 28, 2009 Roberto Carlos Abreu D´ ıaz ´ Arboles

Transcript of Roberto Carlos Abreu D az October 28,...

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Arboles

Roberto Carlos Abreu Dıaz

October 28, 2009

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

1 Arboles

2 Arboles Binarios

3 Arboles binarios JavaCodigo Java para busqueda

4 Insercion de un nodoCodigo Java para insercion

5 Eliminacion de un nodoCaso 1Caso 2Caso 3

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Arboles

Definicion

Un arbol consiste de nodosconectados entre sı por ejes.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Terminologıa

Camino: una secuencia de pasos para llegar desde un nodo Ahasta un nodo B.

Raız : es el nodo en el tope de un arbol, no tiene padre y solopuede haber una raız.

Padre e hijo: si A y B estan conectados y B esta por encimade 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 raız de unsub-arbol.

Nivel : a cuantas generaciones un nodo esta de la raız.

Llave: campo de data.

Recorrido: visitar los nodos de un arbol en cierto orden.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Arboles Binarios

Definicion

Si cada nodo en un arbol puede tener a lo sumo dos hijos, el arboles llamado arbol binario. Los dos hijos de cada nodo se llaman hijoizquierdo e hijo derecho. Los nombres corresponden a susposiciones al dibujarlos.

Nota

El tipo de arbol binario con el que estaremos trabajando se llamaarbol binario de busqueda. Estos se caracterizan porque el hijoizquierdo de un nodo debe tener una llave menor que la de supadre, y el hijo derecho de un nodo debe tener una llave mayor oigual a su padre.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para busqueda

Codigo Java para arboles binarios

c l a s s Node{

i n t data ; // l l a v ep 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 op 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

}c l a s s B i n a r y T r e e {

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 Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para busqueda

Busqueda de un elemento

Aprovecha el orden en que los nodos estan organizados parabuscar los elementos.

Como un nodo tiene a lo sumo un hijo izquierdo menor que ely un hijo derecho mayor que el, el algoritmo se mueverecursivamente por los sub-arboles hasta que encuentre elnodo 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 direccion nula, estosignifica que el nodo buscado no existe en el arbol.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para busqueda

Busqueda de un elemento

Aprovecha el orden en que los nodos estan organizados parabuscar los elementos.

Como un nodo tiene a lo sumo un hijo izquierdo menor que ely un hijo derecho mayor que el, el algoritmo se mueverecursivamente por los sub-arboles hasta que encuentre elnodo 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 direccion nula, estosignifica que el nodo buscado no existe en el arbol.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para busqueda

Busqueda de un elemento

Aprovecha el orden en que los nodos estan organizados parabuscar los elementos.

Como un nodo tiene a lo sumo un hijo izquierdo menor que ely un hijo derecho mayor que el, el algoritmo se mueverecursivamente por los sub-arboles hasta que encuentre elnodo 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 direccion nula, estosignifica que el nodo buscado no existe en el arbol.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para busqueda

Busqueda de un elemento

Aprovecha el orden en que los nodos estan organizados parabuscar los elementos.

Como un nodo tiene a lo sumo un hijo izquierdo menor que ely un hijo derecho mayor que el, el algoritmo se mueverecursivamente por los sub-arboles hasta que encuentre elnodo 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 direccion nula, estosignifica que el nodo buscado no existe en el arbol.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para busqueda

Codigo Java para busqueda

p u b l i c Node f i n d ( i n t key ) {Node c u r r = r o o t ;whi le ( c u r r . data != key ) {

i f ( key < c u r r . data )c u r r = c u r r . l e f t C h i l d ;

e l s ec u r r = c u r r . r i g h t C h i l d ;

i f ( c u r r == n u l l )return n u l l ;

}return c u r r ;

}

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para insercion

Insercion de un nodo

Para insertar un nodo, primero debemos averiguar dondecorresponde 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 elnuevo nodo.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para insercion

Insercion de un nodo

Para insertar un nodo, primero debemos averiguar dondecorresponde 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 elnuevo nodo.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para insercion

Insercion de un nodo

Para insertar un nodo, primero debemos averiguar dondecorresponde 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 elnuevo nodo.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para insercion

Codigo Java para insercion

p u b l i c void i n s e r t ( Node newNode ) {// E s t e e s e l caso base ,// donde e l a r b o l e s t a v a c ı o

i f ( r o o t == n u l l ) {r o o t = newNode ;return ;

}// p a r t e dos en pr ox imo s l i d e

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Codigo Java para insercion

Codigo Java para insercion

Node c u r r = root , p a r e n t ;whi le ( true ) { p a r e n t = c u r r e n t ;

i f ( newNode . data < c u r r . data ) {c u r r = c u r r . l e f t C h i l d ;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 ; return ;}

} e l s e {c u r r = c u r r . r i g h t C h i l d ;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 ; return ;}

}}}

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 3

Eliminacion de un nodo

Acerca de la eliminacion

Hay varios casos a considerar al eliminar un nodo. ¿Que hacer conlos 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 comun: utilizan una funcion debusqueda similar a las de buscar e insertar.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 3

CASO 1: el nodo es hoja

Es el caso mas sencillo

Simplemente se fija a nullel hijo apropiado del padrede ese nodo

En Java, el GarbageCollector se encarga delresto

En este ejemplo, el nodocon la llave 9 es el padre.

Se harıa:nodoPadre.rightChild =null;

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 3

p u b l i c boolean d e l e t e ( i n t key ) {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 = true ;whi le ( c u r r . data != key ){

p a r e n t = c u r r ;i f ( key < c u r r . data ){

i s L e f t = true ;c u r r = c u r r . l e f t C h i l d ;

}e l s e {

i s L e f t = f a l s e ;c u r r = c u r r . r i g h t C h i l d ;

}

i f ( c u r r == n u l l )return f a l s e ;

}// end w h i l ei f ( NoChi ld ( c u r r ) ){

i f ( c u r r == r o o t )r o o t = n u l l ;e l s e i f ( i s L e f t )p a r e n t . l e f t C h i l d =

n u l l ;e l s ep a r e n t . r i g h t C h i l d =

n u l l ;}

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 3

CASO 2: el nodo a eliminar tiene un hijo

Este caso es relativamentesencillo tambien

El nodo tiene a lo sumodos conexiones:

Una con su padre y unacon su hijo

El objetivo es reemplazaral nodo en el padre con suhijo

O sea, si 9 se va aeliminar, el objetivo esfijar a 6 como el rightChildde 4

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 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 ;e l s e i f ( i s L e f t )

p a r e n t . l e f t C h i l d = c u r r . l e f t C h i l d ;e l s e

p a r e n t . r i g h t C h i l d = c u r r . 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 ;e l s e i f ( i s L e f t )

p a r e n t . l e f t C h i l d = c u r r . r i g h t C h i l d ;e l s e

p a r e n t . r i g h t C h i l d = c u r r . r i g h t C h i l d ;

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 3

CASO 3: el nodo a eliminar tiene dos hijos

Si tiene, no se puedereemplazar simplementecon uno de sus hijos (porlo menos cuando el hijotambien tiene hijos).

El objetivo es reemplazaral nodo por su sucesor.Especıficamente, susucesor En-Orden.

Este es el nodo maspequeno del conjunto denodos que son mayoresque el nodo a eliminar.

Roberto Carlos Abreu Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 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 ;whi le ( c u r r e n t != n u l l ) {

p a r e n t = s u c c e s s o r ;s u c c e s s o r = c u r r e n t ;c u r r e n t = c u r r e n t e . l e f t C h i l d ;

}i f ( s u c c e s s o r != node . r i g h t C h i l d ) {

p a r e n t . l e f t C h i l d = s u c c e s s o r . r i g h t C h i l d ;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 Dıaz Arboles

OutlineArboles

Arboles BinariosArboles binarios JavaInsercion de un nodo

Eliminacion de un nodo

Caso 1Caso 2Caso 3

// c o n t i n u a c i o ne l s e {

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 )

r o o t = s u c c e s s o r ;e l s e i f ( i s L e f t )

p a r e n t . l e f t C h i l d = s u c c e s s o r ;e l s e

p a r e n t . r i g h t C h i l d = s u c c e s s o r ;s u c c e s s o r . l e f t C h i l d = c u r r . l e f t C h i l d ;

}return true ;} // end d e l e t e

Roberto Carlos Abreu Dıaz Arboles