Roberto Carlos Abreu D az October 28,...
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