2011-01-27 12 views
8

Actualización:
He encontrado más de un ejemplo de lo que estoy tratando de lograr: Managing Hierarchical Data in MySQL. Quiero hacerlo, pero en JavaScript porque estoy construyendo una aplicación que acepta los comentarios que están en una estructura jerárquica, para ser más específico, reddit.com. Si tiene la extensión Pretty JSON en su navegador web de Chrome, vaya a reddit y haga clic en un comentario de hilos y luego agregue .json a la url para ver lo que estoy analizando.
Obtengo los datos JSON muy bien, solo analiza los comentarios y agrega el HTML apropiado para mostrar que está anidado.
Ideas para soluciones?Algoritmo para el árbol de recorrido


vieja pregunta:
estoy trabajando en un programa y he llegado a una parte que necesito averiguar la lógica antes de escribir el código. Estoy tomando datos que están en formato de árbol pero con la posibilidad de varios hijos para cada nodo padre y los únicos árboles en los que puedo encontrar datos son árboles con pesos o árboles donde como máximo cada nodo tiene dos nodos secundarios. Así que estoy tratando de averiguar el algoritmo para evaluar cada nodo de un árbol como este:

startingParent[15] // [# of children] 
    child1[0] 
    child2[5] 
     child2ch1[4] 
     ... 
     child2ch5[7] 
    child3[32] 
    ... 
    child15[4] 

Ahora, cuando trato de escribir cómo mi algoritmo funcionaría termino escritura For anidados/while pero termine escribiendo un ciclo para cada nivel de la altura del árbol que para los datos dinámicos y los árboles de altura desconocida con un número desconocido de niños por nodo esto no funciona. Sé que en algún momento aprendí a atravesar un árbol como este pero me está escapando por completo ahora. Alguien sabe cómo se hace esto en términos de bucles?

Respuesta

15

Si no va a utilizar recursión, necesita una estructura de datos auxiliar. Una cola le dará un recorrido transversal en anchura, mientras que una pila le dará un recorrido transversal en profundidad. De cualquier manera que se ve más o menos así:

structure <- new stack (or queue) 
push root onto structure 
while structure is not empty 
    node <- pop top off of structure 
    visit(node) 
    for each child of node 
    push child onto structure 
loop 

Wikipedia Referencias

8

Utilice recursividad, no bucles.
Breadth first search
Depth first search
Estos deberían ayudarle a empezar con lo que estamos tratando de lograr

+0

Si no es tarea y que quiere un DFS, sin duda. Sin embargo, pidió específicamente una forma de hacerlo con bucles. BFS no está bien con la recursión en ambos sentidos. –

+0

Sí, esto no es tarea, esto es para una aplicación que estoy construyendo y estoy tratando de completar una lista que, bueno, es como una página de comentarios por lo que hay niveles de respuestas. Comentario principal, respuesta, respuesta de esa respuesta, etc.Así que estaba buscando una forma de analizar los comentarios y crear el HTML apropiado para la estructura. – HuXu7

1

sólo tiene que utilizar la recursividad como

def travel(node): 
    for child in node.childs: 
     # Do something 
     travel(child) 
+1

Solo una pequeña modificación, pero por lo general es mucho más limpio que el "hacer algo" esté fuera de ese círculo. De esta manera se pierde el nodo raíz. –

1

El código más simple para la mayoría recorrido del árbol suele ser recursivo. Para un árbol multivía como el suyo, generalmente es más fácil tener un bucle que mira cada puntero a un elemento secundario, y se llama a sí mismo con ese nodo como argumento, para todos los nodos secundarios.

Cuestiones relacionadas