jueves 24 de septiembre de 2009

Recorrido de un Arbol

Queria postear un codigo que hice sobre recorrido de arboles, lo posteo porque cuando busque una solucion no encontre nada asi que me puse a cranear y lo resolvi.

el arbol es de este tipo:


las restricciones son:
en la tabla los datos quedan asi:
a->b
a->c
a->d
b->e
b->f
c->h
d->j
f->g
f->i
j->n
g->k
i->l
l->m
las restricciones para el arbol son:
no pueden haber bucles:
ej: e->a //esto no puede ocurrir
que se ingresen datos ya existentes como
ej: a->g ; f->m

Ahora les pongo el codigo exactamente como lo programe, tiene muschos echo para q vean lo q hace, pero simplemente pueden leerlo un poco y limpiarlo.

lo que hace el codigo son 2 cosas:
1.- muestra a todos los hijos de algun padre x el que pregunten, si padre no es padre, no muestra nada
2.- muestra los hijos con sus respectivos padres, sobre el padre x el que preguntaron.




<? 
    $conexion = mysql_connect("localhost", "root", "") or die ("kroketas de perro") ;  
    mysql_select_db("PruebaJerarquia", $conexion);  
$sql2="SELECT * FROM jerarquia ";
$Resultado = mysql_query($sql2,$conexion);
?>
muestro el contenido de la bd
<table border="1" align="top">
<tr><td width="200">padre</td><td width="200">hijo</td></tr>
<?
while($Arreglo=mysql_fetch_array($Resultado)){
?>
<tr><td width="200"><? echo $Arreglo[jefe]; ?></td><td width="200"><? echo $Arreglo[emp]; ?></td></tr>
<?
}
?>
</table>
<?
echo "voi a buscar los hijos de la variable ".$rec[0] ="a";
$z=$rec[0];
$x=0;
$i=1;
//la idea es q el x persiga al i mientras se ejecuta la consulta, cada ves q el x no tenga ijos ira asercandose mas y mas al i
//y a su ves mientras sigan habiendo hijos el i se alejara rapidamente del x, sin 'padre' no tiene hijos' el while no se ejecuta
// e i no se incrementa
do{
echo "<br>al inicio x = ".$x;
echo "<br> padre a revisar hijos ".$rec[$x];
$sql="SELECT * FROM jerarquia WHERE (jefe = '$rec[$x]')";
$res = mysql_query($sql, $conexion);
while($arr = mysql_fetch_array($res)){  
$padre[$x][$i] = $rec[$x];
echo "<br> hijo = ".$rec[$i] = $arr[emp];
echo "<br> fin while, rec = ".$rec[$i]."  i =".$i;
echo "<br> i = ".$i++;
}//fin while
echo "<br>antes x = ".$x;
echo "<br>durante x = ".$x++;
echo "<br>despues x = ".$x;
}while($x<=$i);
//ahora muestro los hijos de $z q es el padre inicial
echo "<br> hijos de ".$z;
$j=0;//mostrar
while($j!=$i){
echo "<br>".$rec[$j];
$j++;

//ahora muestro a los padres correspondientes de sus hijos
$k=0;
$y=0;
while($y!=$i){
$k=0;
while($k!=$i){
if(trim($padre[$y][$k]) != NULL){ //si es distinto de null es xq existe un padre valido a mostrar
echo "<br>el padre de ".$rec[$k]." es ";
echo $padre[$y][$k];
}
$k++;
}//fin k
$y++;
}//fin y
?>

anexo ademas la bd, lista para importar, la misma que usa el codigo de arriba




-- phpMyAdmin SQL Dump
-- version 2.10.3
--
-- Servidor: localhost
-- Tiempo de generación: 06-02-2009 a las 02:49:53
-- Versión del servidor: 5.0.51
-- Versión de PHP: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de datos: 'pruebajerarquia'
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla 'jerarquia'
--
CREATE TABLE 'jerarquia' (
  'IdJerarquia' int(255) NOT NULL auto_increment,
  'jefe' varchar(255) NOT NULL,
  'emp' varchar(255) NOT NULL,
  PRIMARY KEY  ('IdJerarquia')
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
--
-- Volcar la base de datos para la tabla 'jerarqui'
--
INSERT INTO 'jerarquia' VALUES (1, 'a', 'b');
INSERT INTO 'jerarquia' VALUES (2, 'a', 'c');
INSERT INTO 'jerarquia' VALUES (3, 'a', 'd');
INSERT INTO 'jerarquia' VALUES (4, 'b', 'e');
INSERT INTO 'jerarquia' VALUES (5, 'b', 'f');
INSERT INTO 'jerarquia' VALUES (6, 'c', 'g');
INSERT INTO 'jerarquia' VALUES (7, 'd', 'h');
INSERT INTO 'jerarquia' VALUES (8, 'g', 'i');
INSERT INTO 'jerarquia' VALUES (9, 'g', 'j');
INSERT INTO 'jerarquia' VALUES (10, 'y', 'z');
INSERT INTO 'jerarquia' VALUES (11, 'y', 'x');
INSERT INTO 'jerarquia' VALUES (12, 'y', 'w');
INSERT INTO 'jerarquia' VALUES (13, 'w', 'q');
INSERT INTO 'jerarquia' VALUES (14, 'w', 's');
INSERT INTO 'jerarquia' VALUES (15, 's', 'k');
INSERT INTO 'jerarquia' VALUES (16, 's', 'l');
INSERT INTO 'jerarquia' VALUES (17, 'k', 'ñ');
INSERT INTO 'jerarquia' VALUES (18, 'z', 'a1');
INSERT INTO 'jerarquia' VALUES (19, 'z', 'a2');
INSERT INTO 'jerarquia' VALUES (20, 'a1', 'a3');
INSERT INTO 'jerarquia' VALUES (21, 'a2', 'a5');



Ojala les sirva