Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/02/2009, 19:55
Avatar de gakutaru
gakutaru
 
Fecha de Ingreso: agosto-2005
Ubicación: frente a mi NtbK
Mensajes: 239
Antigüedad: 18 años, 8 meses
Puntos: 6
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, asi que por eso se los posteo :)
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.



Código PHP:
<?
    $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

Código:
-- 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 `jerarquia`
-- 

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');

Última edición por gakutaru; 17/03/2009 a las 19:05