繁体   English   中英

从一般树的二进制树

[英]Binary tree from general tree

我有一个树结构,其节点具有父ID(无限子节点)。 出于显示目的,我需要这个树结构作为二叉树。 我如何做到这一点是在每个级别节点根据条件分组到一个节点。 选择节点后,将显示其子节点。 例:

N-Ary树

绿色表示条件为true且红色为false

B树

B,C已分组到左侧节点,D,E根据其条件在右侧。

问题:我正在使用KnockoutJS来显示我的树,我需要能够执行常规树操作,例如根据其ID获取节点,插入节点删除节点。 这是我的结构。 有没有更好的结构/方式来做到这一点?

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: []}
            ]}
        ]}
    ]}
];

我不确定你想要什么,但假设:

  1. 您希望插入“groupNodes”,而不是常规节点,并且groupNodes可以包含无限的子节点。
  2. 原始树仅包含常规节点,而不包含groupNodes。
  3. 所有常规节点都有nodeId,条件设置为true或false,以及数组childNodes。
  4. 您不希望创建没有子节点的groupNodes。

那么这是你的答案。

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,也不知道它喜欢什么结构。 我刚刚生成了你指出的结构; 希望这会奏效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM