2011-12-29 21 views
5

Tengo una estructura en árbol que tiene un nodo con una ID padre (nodos hijos ilimitados). Para fines de visualización, necesito esta estructura de árbol como un árbol binario. Cómo hago esto es que en cada nivel los nodos se agrupan en un solo nodo en función de una condición. Cuando se selecciona un nodo, se muestran sus hijos. Ejemplo:Árbol binario del árbol general

N-Ary tree

El verde es cuando la condición es true y el rojo es false

BTree

B, C se han agrupado en el nodo izquierdo y D, E están a la derecha basado en sus condiciones

PREGUNTA: estoy usando KnockoutJS para mostrar mi árbol y tengo que ser capaz de realizar las operaciones normales de árboles como conseguir un nodo en función de su ID, la inserción de nodo (s) eliminar nodo (s). Esta es la estructura que tengo. ¿Hay una mejor estructura/forma de hacer esto?

var tree = [ 
    { groupNodeId: "A", childNodes: [ 
     { nodeId: "A", childGroupNodes: [ 
      { groupNodeId: "B", condition: true, childNodes: [ 
       { nodeId: "B", childGroupNodes: []}, 
       { nodeId: "C", childGroupNodes: []} 
      ]}, 
      { groupNodeId: "D", condition: false, childNodes: [ 
       { nodeId: "D", childGroupNodes: []}, 
       { nodeId: "E", childGroupNodes: []} 
      ]} 
     ]} 
    ]} 
]; 
+0

¿Por qué utiliza '' childGroupNodes' y groupNodeId' para los nodos insertados en lugar de continuar el uso de '' childNodes' y nodeId'? Además, si, por ejemplo, B y C tienen cada uno un hijo cuya 'condición 'es verdadera, ¿quiere que esos dos nodos se agrupen? –

+1

Además, supongo 'condición: true' en groupNode' D' es un error tipográfico? –

+0

Sí lo fue, eso ha sido arreglado – Ryan

Respuesta

3

No estoy seguro exactamente lo que quiere, pero suponiendo que:

  1. desea insertar "groupNodes", nodos no regulares, y que groupNodes tiene hijos ilimitadas.
  2. El árbol original contiene solo nodos regulares, no nodos de grupo.
  3. Todos los nodos comunes tienen un nodeId, una condición establecida en verdadero o falso y una matriz childNodes.
  4. No desea crear nodos de grupo que no tengan hijos.

entonces aquí está su respuesta.

function binize(tree) { 
    var left,right,t,u, 
    stack=[tree]; 
    while(t=stack.pop()) { 
    left=[]; 
    right=[]; 
    while(u=t.childNodes.pop()) { 
     (u.condition?left:right).push(u); 
     stack.push(u); 
    } 
    left.length&&t.childNodes.push({ 
     groupNodeId:left[0].nodeId, 
     condition:true, 
     childNodes:left 
    }); 
    right.length&&t.childNodes.push({ 
     groupNodeId:right[0].nodeId, 
     condition:false, 
     childNodes:right 
    }); 
    } 
} 

Lo probé utilizando esta estructura de datos (tenga en cuenta que tree es el objeto de nivel superior, no una matriz que lo contiene).

var tree={nodeId:'A',childNodes:[ 
    {nodeId:'B',condition:true,childNodes:[]}, 
    {nodeId:'C',condition:true,childNodes:[]}, 
    {nodeId:'D',condition:false,childNodes:[ 
    {nodeId:'F',condition:false,childNodes:[]}, 
    {nodeIf:'G',condition:false,childNodes:[]} 
    ]}, 
    {nodeId:'E',condition:false,childNodes:[]} 
]}; 

Si supiera un poco más acerca de su árbol, entonces podría haber tomado un enfoque diferente. Por ejemplo, si el árbol no es muy profundo, podría ser más eficiente (y, por supuesto, más limpio) cavar recursivamente.

Además, nunca he utilizado KnockoutJS antes, y no tienen idea de lo que le gusta estructuras. Acabo de generar las estructuras que indicaste; con suerte eso funcionará.

+0

Hmmm, voy a probar esto esta noche, pero a mi entender, ¿ahora esto puede ser un conjunto anidado? o un árbol binario que cada nodo contiene otro árbol binario – Ryan

+1

Bueno, alterna los modos, como lo hace su ejemplo. Entonces, el nivel 1 tiene el nodo de nivel superior, y el siguiente nivel es dos nodos de grupo. El siguiente nivel (los hijos de groupNodes) contiene todos los elementos secundarios originales del nodo superior, y el siguiente nivel contiene 2 nodos de grupo por nodo primario (si el grupo no estaría vacío), y así sucesivamente. Eso es lo que querías, ¿verdad? –

+0

Sí lo es, en parte ...Esto muestra cómo crear mi árbol a partir de un árbol general, pero quiero saber cómo atravesar mi estructura de manera eficiente. – Ryan