Binarios binarios Java October 28, 2009
Binarios binarios Java 1 2 Binarios 3 binarios Java Código Java para búsqueda 4 Código Java para inserción 5 Caso 1 Caso 2 Caso 3
Outline Binarios binarios Java Definición Un árbol consiste de nodos conectados entre sí por ejes.
Terminología Outline Binarios binarios Java Camino: una secuencia de pasos para llegar desde un nodo A hasta un nodo B. Raíz: es el nodo en el tope de un árbol, no tiene padre y sólo puede haber una raíz. Padre e hijo: si A y B están conectados y B está 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-árbol: Cualquier nodo puede ser considerado la raíz de un sub-árbol. Nivel: a cuántas generaciones un nodo está de la raíz. Llave: campo de data. Recorrido: visitar los nodos de un árbol en cierto orden.
Binarios binarios Java Binarios Definición Si cada nodo en un árbol puede tener a lo sumo dos hijos, el árbol es llamado árbol 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 árbol binario con el que estaremos trabajando se llama árbol binario de búsqueda. 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.
Binarios binarios Java Código Java para búsqueda Código Java para árboles binarios c l a s s { Node i n t data ; // 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 derecho c l a s s B inarytree { 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...
Binarios binarios Java Código Java para búsqueda Búsqueda de un elemento
Binarios binarios Java Código Java para búsqueda Búsqueda de un elemento Aprovecha el orden en que los nodos están organizados para buscar los elementos.
Binarios binarios Java Código Java para búsqueda Búsqueda de un elemento Aprovecha el orden en que los nodos están organizados para buscar los elementos. Como un nodo tiene a lo sumo un hijo izquierdo menor que él y un hijo derecho mayor que él, el algoritmo se mueve recursivamente por los sub-árboles 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.
Binarios binarios Java Código Java para búsqueda Búsqueda de un elemento Aprovecha el orden en que los nodos están organizados para buscar los elementos. Como un nodo tiene a lo sumo un hijo izquierdo menor que él y un hijo derecho mayor que él, el algoritmo se mueve recursivamente por los sub-árboles 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ón nula, esto significa que el nodo buscado no existe en el árbol.
Binarios binarios Java Código Java para búsqueda Código Java para búsqueda p u b l i c Node f i n d ( i n t key ) { Node c u r r = r o o t ; while ( 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 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 n u l l ; return c u r r ;
Binarios binarios Java Código Java para inserción
Binarios binarios Java Código Java para inserción Para insertar un nodo, primero debemos averiguar dónde corresponde en el árbol. ( Wao!)
Binarios binarios Java Código Java para inserción Para insertar un nodo, primero debemos averiguar dónde corresponde en el árbol. ( Wao!) El código prácticamente es el mismo que el de buscar un nodo (no existente). No existente porque en ese espacio libre es que se colocará el nuevo nodo.
Binarios binarios Java Código Java para inserción Código Java para inserción p u b l i c void i n s e r t ( Node newnode ) { // Este es e l caso base, // donde e l á r b o l e s t á 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óximo s l i d e
Binarios binarios Java Código Java para inserción Código Java para inserción Node c u r r = root, p a r e n t ; while ( 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 ;
Binarios binarios Java Caso 1 Caso 2 Caso 3 Acerca de la eliminación Hay varios casos a considerar al eliminar un nodo. Qué 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ún: utilizan una función de búsqueda similar a las de buscar e insertar.
Binarios binarios Java CASO 1: el nodo es hoja Caso 1 Caso 2 Caso 3 Es el caso más 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 haría: nodopadre.rightchild = null;
Binarios binarios Java Caso 1 Caso 2 Caso 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 ; while ( 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 e i f ( NoChild ( 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 e p a r e n t. r i g h t C h i l d = n u l l ;
Binarios binarios Java Caso 1 Caso 2 Caso 3 CASO 2: el nodo a eliminar tiene un hijo Este caso es relativamente sencillo también 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
Binarios binarios Java 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 ; 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 ;
Binarios binarios Java 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 también tiene hijos). El objetivo es reemplazar al nodo por su sucesor. Específicamente, su sucesor En-Orden. Éste es el nodo más pequeño del conjunto de nodos que son mayores que el nodo a eliminar.
Binarios binarios Java 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 ; while ( 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 ;
Binarios binarios Java Caso 1 Caso 2 Caso 3 // c o n t i n u a c i o n e 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