2 votos

RECORRER ÁRBOL DE ARRIBA A ABAJO Y DE IZQUIERDA A DERECHA PHP

Hola chicos! tengo un árbol metdo en una tabla, y quisiera sacar los valores en orden de arriba a abajo y de izda a dcha en php. La función recursiva es :

<?php 
//Aqui, rellenar con una SELECT
$t_jerarquia[][]=" ";
$t_jerarquia [0][0]= " ";
$t_jerarquia [0][1]= 0;
$t_jerarquia [1][0]= 0;
$t_jerarquia [1][1]= 1;
$t_jerarquia [2][0]= 0;
$t_jerarquia [2][1]= 2;
$t_jerarquia [3][0]= 0;
$t_jerarquia [3][1]= 3;
$t_jerarquia [4][0]= 1;
$t_jerarquia [4][1]= 11;
$t_jerarquia [5][0]= 1;
$t_jerarquia [5][1]= 12;
$t_jerarquia [6][0]= 11;
$t_jerarquia [6][1]= " ";
$t_jerarquia [7][0]= 12;
$t_jerarquia [7][1]= " ";
$t_jerarquia [8][0]= 2;
$t_jerarquia [8][1]= 21;
$t_jerarquia [9][0]= 2;
$t_jerarquia [9][1]= 22;
$t_jerarquia [10][0]= 22;
$t_jerarquia [10][1]= 221;
$t_jerarquia [11][0]= 22;
$t_jerarquia [11][1]= 222;
$t_jerarquia [12][0]= 221;
$t_jerarquia [12][1]= " ";
$t_jerarquia [13][0]= 222;
$t_jerarquia [13][1]= " ";
$t_jerarquia [14][0]= 3;
$t_jerarquia [14][1]= " ";

//inicializar el proceso con root

function buscaren_t_grande($n) {

    $t_hijos [] = "";
    $i=0;
    global $t_jerarquia;
    while ( $i<sizeof($t_jerarquia)) {

        if ($t_jerarquia [$i][0] === $n ) {

            array_push($t_hijos,$t_jerarquia[$i][1]);
        }
        $i++;
    }
    return $t_hijos;
}

function recorrerArbol($t_pequena){

    for ($i=0;$i<sizeof($t_pequena);$i++){

        $t_peq=buscaren_t_grande($t_pequena[$i]);
        if ($t_peq[0] !== " ") {
            recorrerArbol($t_peq);
        }
    }

}

$t_inicial[0]= 0; //inicializar on root

recorrerArbol ($t_inicial);

?>

La primera vez lo hace bien , le pasa un cero a la función buscaren_t_grande y ésta devuelve 1,2,3 (los hijos de cero).Pero en las siguientes llamadas , no es capaz de pasarle nada.LLama una y otrqa vez a recorrerArbol sin pasarle nada y se mete en un bucle infinito

Lo siguiente que debería pasarle en la segunda llamada a recorrerArbol es un 1,que es el primer elemento del array devuelto por buscaren_t_grande

El resultado final que ando buscando es : 0,1,11,12,2,21,22,221,222,3

¿me podéis ayudar, por favor?

Mil gracias!!!

0 votos

No entiendo bien del todo cual es el output que quieres, yo veo que cada número tiene 2 hijos, pero veo que los hijos de 0 son " " y 0. De todas formas, te recomiendo que utilices "foreach". Ej: foreach($t_jerarquia as $indice => $hijos ) para los bucles

-1voto

Mayte Terrero Puntos 30

Hola! Para quien le pueda servir, es un recorrido en preorden de un árbol en PHP. El algoritmo está bien.El tema era la inicialización de los arrays. Solución:

<?php //Aqui, rellenar con una SELECT

$t_jerarquia [0][0]= NULL; $t_jerarquia [0][1]= 0; $t_jerarquia [1][0]= 0; $t_jerarquia [1][1]= 1; $t_jerarquia [2][0]= 0; $t_jerarquia [2][1]= 2; $t_jerarquia [3][0]= 0; $t_jerarquia [3][1]= 3; $t_jerarquia [4][0]= 1; $t_jerarquia [4][1]= 11; $t_jerarquia [5][0]= 1; $t_jerarquia [5][1]= 12; $t_jerarquia [6][0]= 11; $t_jerarquia [6][1]= NULL; $t_jerarquia [7][0]= 12; $t_jerarquia [7][1]= NULL; $t_jerarquia [8][0]= 2; $t_jerarquia [8][1]= 21; $t_jerarquia [9][0]= 2; $t_jerarquia [9][1]= 22; $t_jerarquia [10][0]= 22; $t_jerarquia [10][1]= 221; $t_jerarquia [11][0]= 22; $t_jerarquia [11][1]= 222; $t_jerarquia [12][0]= 221; $t_jerarquia [12][1]= NULL; $t_jerarquia [13][0]= 222; $t_jerarquia [13][1]= NULL; $t_jerarquia [14][0]= 3; $t_jerarquia [14][1]= NULL;

//inicializar el proceso con root

function buscaren_t_grande($n) {

$t_hijos = array();
$i=0;
global $t_jerarquia;
while ($i<sizeof($t_jerarquia)) {

    if ($t_jerarquia [$i][0] === $n ) {

        array_push($t_hijos,$t_jerarquia[$i][1]);
    }
    $i++;
}
return $t_hijos;

}

function recorrerArbol($t_pequena){

for ($i=0;$i<sizeof($t_pequena);$i++){

    echo $t_pequena[$i];
    $t_peq = array();
    $t_peq=buscaren_t_grande($t_pequena[$i]);

    if ($t_peq[0] !== NULL) {

        recorrerArbol($t_peq);
    }
}

}

$t_root = array (0); recorrerArbol($t_root);

//$t_peq=buscaren_t_grande (0);

//print_r($t_peq);

?>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: