09.05.2013 Views

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

380 Capítulo 17. Estructuras de datos recursivas<br />

❡❡ <br />

Una mejora de los árboles de búsqueda consiste <strong>en</strong> añadir un campo clave <strong>en</strong><br />

cada nodo y realizar las búsquedas comparando los valores de dichas claves<br />

<strong>en</strong> lugar de los valores del campo cont<strong>en</strong>ido. De esta forma, pued<strong>en</strong> existir<br />

<strong>en</strong> el árbol dos nodos con el mismo valor <strong>en</strong> el campo cont<strong>en</strong>ido pero con<br />

clave distinta. En este texto se implem<strong>en</strong>tan los árboles de búsqueda sin<br />

campo clave para simplificar la pres<strong>en</strong>tación; la modificación de la implem<strong>en</strong>tación<br />

para incluir un campo clave es un ejercicio trivial.<br />

Operaciones básicas<br />

Las operaciones básicas para el manejo de árboles de búsqueda son la consulta,<br />

la inserción y la eliminación de nodos. Las dos primeras son de fácil<br />

implem<strong>en</strong>tación, haci<strong>en</strong>do uso de la natural recursividad de los árboles. La operación<br />

de eliminación de nodos es, sin embargo, algo más compleja, como se<br />

detalla a continuación.<br />

Búsqueda de un nodo<br />

Debido al ord<strong>en</strong> intrínseco de un árbol de búsqueda binaria, es fácil implem<strong>en</strong>tar<br />

una función que busque un determinado valor <strong>en</strong>tre los nodos del árbol y,<br />

<strong>en</strong> caso de <strong>en</strong>contrarlo, proporcione un puntero a ese nodo. La versión recursiva<br />

de la función es particularm<strong>en</strong>te s<strong>en</strong>cilla, todo consiste <strong>en</strong> partir de la raíz y<br />

rastrear el árbol <strong>en</strong> busca del nodo <strong>en</strong> cuestión, según el sigui<strong>en</strong>te diseño:<br />

si arbol es vacío <strong>en</strong>tonces<br />

Devolver fallo<br />

<strong>en</strong> otro caso si arbol^.cont<strong>en</strong>ido = dato <strong>en</strong>tonces<br />

Devolver el puntero a la raíz de arbol<br />

<strong>en</strong> otro caso si arbol^.cont<strong>en</strong>ido > dato <strong>en</strong>tonces<br />

Buscar <strong>en</strong> el hijo izquierdo de arbol<br />

<strong>en</strong> otro caso si arbol^.cont<strong>en</strong>ido < dato <strong>en</strong>tonces<br />

Buscar <strong>en</strong> el hijo derecho de arbol<br />

La codificación <strong>en</strong> <strong>Pascal</strong> es directa:<br />

function Encontrar(dato: tElem; arbol: tArbol): tArbol;<br />

{Dev. un puntero al nodo con dato, si dato está <strong>en</strong> arbol, o<br />

nil <strong>en</strong> otro caso}<br />

begin<br />

if arbol = nil th<strong>en</strong><br />

Encontrar:= nil<br />

else with arbol^ do<br />

if dato < cont<strong>en</strong>ido th<strong>en</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!