ÉUEROHV &DUORV'HOJDGR.ORRV ,QJHQLHUtD7HOHPiWLFD 8QLY&DUORV,,,GH0DGULG Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 1 'HILQLFLyQQRUHFXUVLYD ❚ 8QiUEROFRQVLVWHHQXQFRQMXQWRGH QRGRV\XQFRQMXQWRGHDULVWDVGH IRUPDTXH ❙ 6HGLVWLQJXHXQQRGROODPDGRUDt] ❙ $FDGDQRGRKH[FHSWRODUDt]OHOOHJDXQD DULVWDGHRWURQRGRS S SDGUH GHK KXQRGHORVKLMRVGHS ❙ 3DUDFDGDQRGRKD\XQFDPLQR VHFXHQFLD GHDULVWDV~QLFR GHVGHODUDt] Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 2 1 (MHPSOR Raíz (sin padre) El padre de h S Un hijo de p hermano de h K Hojas (sin hijos) Hojas (sin hijos) Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 3 (MHPSOR Raíz (sin padre) El padre de h S Un hijo de p hermano de h K Hojas (sin hijos) Copyright © 2001 cdk@it.uc3m.es Hojas (sin hijos) Java: Árboles / 4 2 'HILQLFLyQUHFXUVLYD ❚ 8QiUEROHV ❙ 8QQRGR ❙ RXQQRGR\VXEiUEROHVFRQHFWDGRVFRQHO QRGRSRUPHGLRGHXQDDULVWDDVXUDt] No incluye al árbol vacío Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 5 'HILQLFLyQUHFXUVLYD ❚ 8QiUEROHV ❙ YDFtR ❙ RXQQRGR\FHURRPiVVXEiUEROHVQRYDFtRV FRQHFWDGRVFRQHOQRGRSRUPHGLRGHXQD DULVWDDVXUDt] Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 6 3 (MHPSORV ❚ 8QVLVWHPDGHILFKHURV ❚ /DHVWUXFWXUDGHXQGRFXPHQWRFDStWXORV DSDUWDGRVVXEDSDUWDGRV ❚ 8QiUEROGHGHFLVLyQ ❚ 8QiUEROJHQHDOyJLFR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 7 Java: Árboles / 8 Copyright © 2001 cdk@it.uc3m.es 4 &LWD ❚ 7KHVWUXFWXUHRIFRQFHSWVLVIRUPDOO\FDOOHGD KLHUDUFK\ DQGVLQFHDQFLHQWWLPHVKDVEHHQD EDVLFVWUXFWXUHIRUDOOZHVWHUQNQRZOHGJH .LQJGRPVHPSLUHVFKXUFKHVDUPLHVKDYHDOO EHHQVWUXFWXUHGLQWRKLHUDUFKLHV7DEOHVRI FRQWHQWVRIUHIHUHQFHPDWHULDODUHVRVWUXFWXUHG PHFKDQLFDODVVHPEOLHVFRPSXWHUVRIWZDUHDOO VFLHQWLILFDQGWHFKQLFDONQRZOHGJHLVVR VWUXFWXUHG 5REHUW 03LUVLJ=HQDQG WKH$UWRI0RWRUF\FOH0DLQWHQDQFH Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 9 7HUPLQRORJtD ❚ 8QQRGRHVH[WHUQRVLQRWLHQHKLMRVHVKRMD ❚ 8QQRGRHVLQWHUQRVLWLHQHXQRDPiVKLMRV ❚ 8QQRGRHVDVFHQGLHQWHGHRWURVLHVSDGUH GHpORDVFHQGLHQWHGHVXSDGUH ❚ 8QQRGRHVGHVFHQGLHQWH GHRWURVLHVWHHV DVFHQGLHQWHGHOSULPHUR ❚ /RVGHVFHQGLHQWHVGHXQQRGRGHWHUPLQDQXQ VXEiUERO HQHOTXHHVHQRGRKDFHHOSDSHOGH UDt] Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 10 5 7HUPLQRORJtD ❚ 8QiUEROHVRUGHQDGRVLSDUDFDGDQRGR H[LVWHXQRUGHQOLQHDOSDUDWRGRVVXV KLMRV ❚ 8QiUEROELQDULR HVXQiUERORUGHQDGR HQHOTXHFDGDQRGRWLHQH RKLMRV HOKLMRL]TXLHUGR\HOGHUHFKR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 11 7HUPLQRORJtD ❚ 8QFDPLQR GHXQQRGRDRWURHVXQD VHFXHQFLDGHDULVWDVFRQVHFXWLYDVTXH OOHYDQGHOSULPHURDOVHJXQGR6XORQJLWXG HVHOQ~PHURGHDULVWDVTXHWLHQH ❚ /DSURIXQGLGDG GHXQQRGRHVOD ORQJLWXGGHOFDPLQRGHODUDt]DHVHQRGR ❚ /DDOWXUD GHXQiUEROHVODSURIXQGLGDG GHOQRGRPiVSURIXQGR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 12 6 $OJRULWPRVEiVLFRV ❚ ❚ ❚ ❚ 7DPDxRQ~PHURGHQRGRV 3URIXQGLGDGGHXQQRGR $OWXUD 5HFRUULGRV ❙ (XOHU ❙ 3UHLQ \SRVWRUGHQ ❚ 6XSRQHPRViUEROHVELQDULRVSDUD VLPSOLILFDU Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 13 &ODVH1RGRELQDULR class NodoB { Object d; NodoB izq; NodoB der; NodoB() {this(null);} NodoB(Object o) {this(o,null,null);} NodoB(Object o, NodoB i, NodoB d) {d=o; izq=i; der=d;} Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 14 7 &ODVH1RGRELQDULR static int size (NodoB a){...;} static int height (NodoB a){...;} void preorder (NodoB a){...;} void inorder (NodoB a){...;} void postorder (NodoB a){...;} } Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 15 &ODVHÉUEROELQDULR class ArbolB { protected NodoB raiz; ArbolB() {raiz=null;} ArbolB(Object o){raiz=new NodoB(o);} public int size() {return NodoB.size(raiz);} public int height() {return NodoB.height(raiz);} Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 16 8 &ODVHÉUEROELQDULR public void preorder () {if (raiz!=null) raiz.preorder();} public void inorder () {if (raiz!=null) raiz.inorder();} public void postorder () {if (raiz!=null) raiz.postorder();} } Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 17 7DPDxR static int size (NodoB a){ if (a==null) return 0; else return 1+size(a.izq)+size(a.der); } Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 18 9 $OWXUD static int height (NodoB a){ if (a==null) return (-1); else return 1+Math.max(height(a.izq), height(a.der)); } Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 19 Java: Árboles / 20 5HFRUULGRGH(XOHU Copyright © 2001 cdk@it.uc3m.es 10 5HFRUULGRSUHRUGHQ Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 21 5HFRUULGRSRVWRUGHQ Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 22 11 5HFRUULGRLQRUGHQ VLPpWULFR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 23 Java: Árboles / 24 SUHRUGHQ void preorder (){ System.out.println(d); if (izq != null) izq.preorder(); if (der != null) der.preorder(); } Copyright © 2001 cdk@it.uc3m.es 12 SRVWRUGHQ void postorder (){ if (izq != null) izq.postorder(); if (der != null) der.postorder(); System.out.println(d); } Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 25 Java: Árboles / 26 LQRUGHQ void inorder (){ if (izq != null) izq.inorder(); System.out.println(d); if (der != null) der.inorder(); } Copyright © 2001 cdk@it.uc3m.es 13 $%&²' $ ² % & Copyright © 2001 cdk@it.uc3m.es ' Java: Árboles / 27 (MHPSOR ,QILMR 3UHILMR 3RVILMR $% $% $% $%±& ±$%& $%&± $%&±' $%±&' $%&'± Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 28 14 1RWDFLyQSRVWILMR ❚ &DOFXODGRUDV+3 ❚ 3LODSDUDDOPDFHQDURSHUDQGRV ❚ (M± Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 29 3URSLHGDGHVGH iUEROHVELQDULRV ❚ 6HD ❙ ❙ ❙ ❙ ( , 1 + 1~PHURGHQRGRVH[WHUQRV 1~PHURGHQRGRVLQWHUQRV 7DPDxR (, $OWXUD ❚ 6HFXPSOH ❙ ( , ❙ +è(è+ +è,è+ ❙ ORJ1è+è1 Copyright © 2001 cdk@it.uc3m.es +è1è+ Java: Árboles / 30 15 ,PSOHPHQWDFLRQHV ❚ %DVDGDHQVHFXHQFLD ❚ %DVDGDHQHVWUXFWXUDHQOD]DGD Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 31 ,PSOHPHQWDFLyQ EDVDGDHQVHFXHQFLD Copyright © 2001 cdk@it.uc3m.es SUDL] S[L]T S[ S[GHU S[ Java: Árboles / 32 16 ,PSOHPHQWDFLyQ EDVDGDHQHQODFHV Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 33 ÉUEROHVELQDULRV GHE~VTXHGD ❚ 8QiUEROELQDULRGHE~VTXHGD HVXQ iUEROELQDULRHQHOTXHSDUDFDGDQRGRQ ❙ WRGDVODVFODYHVGHORVQRGRVGHO VXEiUEROL]TXLHUGR VRQ PHQRUHVTXHODFODYHGHQRLJXDOHV ❙ \WRGDVODVGHOVXEiUEROGHUHFKR PD\RUHVRLJXDOHV Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 34 17 (MHPSOR 1 2 3 Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 35 (MHPSOR Copyright © 2001 cdk@it.uc3m.es 1 2 3 4 Java: Árboles / 36 18 2SHUDFLRQHV ❚ %~VTXHGD ❚ ,QVHUFLyQ ❚ (OLPLQDFLyQ Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 37 %~VTXHGD %XVFDPRVHO³´ 6XEiUERO L]TXLHUGR ! 6XEiUERO GHUHFKR (OHPHQWR HQFRQWUDGR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 38 19 ,QVHUFLyQ • 7 9 2 1 Nos desplazamos dependiendo del resultado de la comparación, cuando lleguemos a una hoja insertamos. – Si la clave del elemento a insertar coincide con la del nodo raíz el elemento a insertar sustituye al que había – Si es menor buscamos en el subárbol izquierdo – Si es mayor buscamos en el subárbol derecho – Si llegamos a un nodo degenerado 5 3 6 – Si es menor insertamos a la izquierda – Si es mayor insertamos a la derecha Ejemplo insertar el 6 Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 39 (OLPLQDFLyQ 7 7 • 9 2 1 5 1 Elimino el 5 (1 hijo) 3 9 2 3 7 9 2 1 5 3 7 9 3 1 5 Es complicado ya que los nodos internos mantienen al árbol conectado. Para eliminar: – Si se trata de una hoja se elimina directamente – Si tiene un único hijo se elimina el nodo haciendo que su nodo padre pase a referenciar a su nodo hijo – Si tiene dos hijos : – Se sustituye el nodo por el menor elemento de su subárbol derecho – Se elimina el nodo correspondiente a dicho menor elemento Elimino el 2 (2 hijos) Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 40 20 ÉUEROHV$9/ ❚ 8QiUERO$9/ HVXQiUEROELQDULRGH E~VTXHGDHQHOFXDOSDUDFDGDQRGRODV DOWXUDVGHORVVXEiUEROHVGLILHUHQDOR VXPRHQXQR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 41 0RQWtFXORV+HDSV ❚ 8QPRQWtFXOR HVXQiUEROELQDULRHQHO TXHSDUDFDGDQRGRQH[FHSWRSDUDHO UDt]VXFODYHHVPD\RURLJXDOTXHODGH VXSDGUH ❚ 6LUYHSDUDODLPSOHPHQWDFLyQGHFRODVFRQ SULRULGDG Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 42 21 (MHPSOR Copyright © 2001 cdk@it.uc3m.es Java: Árboles / 43 Java: Árboles / 44 2WURViUEROHV ❚ ÈUEROURMLQHJUR ❚ ÈUEROHV$$ ❚ ÈUEROHV% Copyright © 2001 cdk@it.uc3m.es 22