M7

Page 15

© FUOC • P06/05001/00581 • Mòdul 7

15

Arbres de cerca

cant la posició en què s’ha d’inserir el nou element. Si la posició en què s’ha d’inserir ja està ocupada per un altre element amb la mateixa clau, aquest serà substituït. En canvi, si la posició en què cal inserir està buida, l’element s’hi afegirà com una fulla nova. Primer cal buscar la posició en què s’ha d’inserir el nou element. Si l’arbre està buit, l’element es col·loca en la seva arrel. Si no està buit, es baixa per l’arbre “visitant” els seus fills i comparant-los amb el nou element, i es decideix per a cada node visitat en quin lloc cal inserir. Hi ha tres casos: • Si el nou element és igual al del node visitat, se substitueix el contingut del node pel nou element i la inserció acaba. • Si el nou element és més petit que el del node visitat, es baixa per l’esquerra. • En canvi, si el nou element és més gran, es baixa per la seva dreta. La cerca s’atura si s’arriba al primer cas o si s’assoleix un node buit que serà just la posició en què cal inserir el nou element. Una vegada trobada la posició, simplement s’insereix l’element com un node nou i l’algorisme s’acaba.

Repetició d’elements Tal com ja hem comentat, els ABC no estan dissenyats per a emmagatzemar elements repetits. Per això, en cas d’igualtat de l’element per inserir amb algun element de l’arbre, s’opta per substituir aquest darrer. Tanmateix, és possible canviar aquest comportament i fer que el nou element s’acumuli en una llista de col·lisions associada al node, i així poder emmagatzemar les repeticions.

L’algorisme de l’operació d’inserció, abstret de l’operació inserir disponible en la implementació del TAD ArbreBinariCercaEncadenat, és el següent:

Posicio<E> inserir (Posició<E> pare, E elem) { if (pare == null) return super.afegir(pare, elem); Posicio<E> node = null; int comp = comparar(elem, pare.getElem()); if (comp == 0) { super.substituir(pare, elem); node = pare; } else if (comp <0) { if (fillEsquerre(pare) == null) node = super.inserirFillDret(pare, elem); else node = inserir(fillEsquerre(pare), elem); } else { if (fillDret(pare) == null) node = super.inserirFillDret(pare, elem); else node = inserir(fillDret(pare), elem); } equilibrar(pare); return node; }


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.