Este documento describe un código en Mathematica para generar un árbol aleatorio con un número n de nodos y n-1 aristas. Explica cómo recorrer el árbol de forma profunda y ancha para buscar un dato ingresado por el usuario, guardando los nodos visitados en una lista. Si el dato se encuentra, imprime la posición; de lo contrario, indica que no fue encontrado. Finalmente, presenta un ejemplo del árbol generado y los resultados de los recorridos de búsqueda.
3. EXPLICACIÓN DEL CÓDIGO PARA GENERAR UN
ÁRBOL ALEATORIAMENTE.
El siguiente código fue desarrollado en Mathematica 9.0.
Primero buscaremos crear un árbol aleatoriamente , con n cantidad de
nodos y n – 1 aristas.
ArbolSA[n_]:=Module[{},G=RandomGraph[{n,n-
1},VertexLabels ->"Name",
ImagePadding -> 10];While[ConnectedGraphQ[G]ŠFalse,
G=RandomGraph[{n,n-1},VertexLabels ->
"Name",ImagePadding -> 10]];Return[G]];
4. Podemos solicitarle al usuario que digite la cantidad de nodos que desea y
el dato que desea buscar, y por medio del método anterior (ArbolSA)
guardamos en el árbol en una variable T.
a=Input["digite la cantidad de nodos que desea
tener el arbol"]
dato=Input["Digite el dato que desea buscar que
este entre 1 y ",a]
T=ArbolSA [a]
5. Creamos una lista para guardar el recorrido a lo largo por vértices, se crea
un contador para recorrer esa lista por medio de un for y retornar la
posición donde se encuentra el dato.
La variable cont se utilizara para recorrer a lo largo mientras que aux para
recorrer a lo ancho.
L={};
cont=0;
aux=0
6. Ahora lo que haremos es mediante el comando DepthFirstScan
recorreremos el árbol a lo largo por cada uno de sus nodos, y vamos
guardando mediante el comando L=Append[L,#])&)} los vértices en su
respectivo orden.
Imprimos la lista L, la cantidad de nodos el dato que se quiere buscar.
Ahora volvemos a recorrer el árbol con el comando DepthFirstScan y
mediante un If preguntamos que si el dato es igual al nodo imprimimos
que lo encontró.
Después con un for recorremos la lista L y si encuentra el dato
imprimimos que se encontró y la posición i donde se encuentra el dato.
Y al contador lo igualamos a 1 y hacemos un break para que no
continúe con la lista si es encontrado.
Por último tenemos un If que pregunta si contador es igual a cero, por
que si es así significa que el dato nunca se encontró, por lo cual
imprimimos que el dato no fue encontrado.
7. Print["ARBOL RECORRIDO BUSCAR PRIMERO A LO LARGO POR
VERTICES"]
DepthFirstScan[T,1,{"PrevisitVertex" -> ((L=Append[L,#])&)}];
Print[L]
Print["Cantidad de vertices que tiene el arbol ",a]
Print["Dato a buscar en el arbol generado ", dato]
DepthFirstScan[T,1,{"PrevisitVertex" -> ((L=Append[L,If[dato =
=#,Print["encontro el dato numero ",#]]])&)}];
For[i=1, i <= Length[L],If[dato ==L[[i]],Print["encontro el dato en la posicion
",i];
cont=1;Break[]];i++]
If[cont= = 0,Print["no se encontro el dato"]]
8. Para hacer la busqueda a lo ancho es muy similar a la anterior solo que en
vez del comando DepthFirstScan usaremos BreadthFirstScan
recorreremos el árbol a lo ancho por cada uno de sus nodos, y vamos
guardando mediante el comando B=Append[L,#])&)} los vértices en su
respectivo orden.
Imprimos la lista B, la cantidad de nodos el dato que se quiere buscar.
Ahora volvemos a recorrer el árbol con el comando BreadthFirstScan y
mediante un If preguntamos que si el dato es igual al nodo imprimimos
que lo encontró.
Después con un for recorremos la lista B y si encuentra el dato imprimimos
que se encontró y la posición i donde se encuentra el dato. Y al
contador lo igualamos a 1 y hacemos un break para que no continúe
con la lista si es encontrado.
Por último tenemos un If que pregunta si contador es igual a cero, por
que si es así significa que el dato nunca se encontró, por lo cual
imprimimos que el dato no fue encontrado.
9. Print["ARBOL RECORRIDO BUSCAR PRIMERO A LO LARGO POR
VERTICES"]
B={};
BreadthFirstScan[T,1,{"PrevisitVertex" -> ((B=Append[B,#])&)}];
Print[B]
Print["Cantidad de vertices que tiene el arbol ",a]
Print["Dato a buscar en el arbol generado ", dato]
BreadthFirstScan[T,1,{"PrevisitVertex" ->
((B=Append[B,If[dato==#,Print["encontro el dato numero ",#]]])&)}];
For[i=1,i <= Length[B],If[dato= =B[[i]],Print["encontro el dato en la posicion
",i];aux=1;Break[]];i++]
If[aux= =0,Print["no se encontro el dato"]]