我有一个树结构,其节点具有父ID(无限子节点)。出于显示目的,我需要这个树结构作为二叉树。我如何做到这一点是在每个级别节点根据条件分组到一个节点。选择节点后,将显示其子节点。例如:
绿色表示条件为true
且红色为false
B,C已被分组到左侧节点,D,E位于右侧,基于它们的条件。
问题:我正在使用KnockoutJS显示我的树,我需要能够执行常规树操作,例如根据其ID获取节点,插入节点删除节点(s )。这是我的结构。有没有更好的结构/方式来做到这一点?
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 :(得分:3)
我不确定你想要什么,但假设:
然后这是你的答案。
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
});
}
}
我使用这个数据结构测试了它(注意树是顶级对象,而不是包含它的数组)。
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:[]}
]};
如果我对你的树有更多了解,那么我可能采取了不同的方法。例如,如果树不是很深,那么递归地挖掘它可能会更有效(当然也更清晰)。
另外,我之前从未使用过KnockoutJS,也不知道它喜欢什么结构。我刚刚生成了你指出的结构;希望这会奏效。