Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一般树的二叉树_Javascript_Tree_Binary Tree_Knockout.js - Fatal编程技术网

Javascript 一般树的二叉树

Javascript 一般树的二叉树,javascript,tree,binary-tree,knockout.js,Javascript,Tree,Binary Tree,Knockout.js,我有一个树结构,它有一个具有父ID的节点(无限子节点)。出于显示目的,我需要将此树结构作为二叉树。我如何做到这一点是在每一个级别上,根据条件将节点分组到单个节点中。选择节点后,将显示其子节点。例如: 当条件为true时为绿色,当条件为false B、 C已根据其条件分组到左侧节点,D、E位于右侧 问题:我正在使用KnockoutJS显示我的树,我需要能够执行正常的树操作,例如根据节点ID获取节点、插入节点和删除节点。这就是我的结构。是否有更好的结构/方法来实现这一点 var tree = [

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

当条件为
true
时为绿色,当条件为
false

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

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

  • 您希望插入“groupNodes”,而不是常规节点,并且groupNodes可以有无限的子节点
  • 原始树仅包含常规节点,而不包含groupNodes
  • 所有常规节点都有一个nodeId、一个设置为true或false的条件以及一个数组childNodes
  • 您不希望创建没有子节点的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
        });
      }
    }
    
    我使用这个数据结构测试了它(注意树是顶级对象,而不是包含它的数组)

    如果我对你的树多了解一点,我可能会采取不同的方法。例如,如果树不是很深,那么递归地挖掘可能更有效(当然也更干净)


    而且,我以前从未使用过KnockoutJS,也不知道它喜欢什么结构。我刚刚生成了您所指出的结构;希望这能起作用。

    为什么对插入的节点使用
    childGroupNodes
    groupNodeId
    ,而不是继续使用
    childNodes
    nodeId
    ?此外,例如,如果B和C各自有一个子节点,其
    条件
    为true,您希望将这两个节点分组在一起吗?此外,我假设groupNode
    D
    中的
    条件:true
    是一个输入错误?嗯,今晚我将对此进行测试,但根据我现在的理解,这可能是一个嵌套集?或者一个二叉树,每个节点包含另一个二叉树,它交替模式,就像你的例子一样。因此,级别1有顶级节点,下一个级别是两个groupNodes。下一级(groupNodes的子级)包含顶部节点的所有原始子级,下一级包含每个父节点2个groupNodes(如果组不是空的),依此类推。这就是你想要的,对吗?是的,部分是。。。这显示了如何从普通树创建我的树,但我想知道如何高效地遍历我的结构啊,好吧,我想你已经有了遍历函数,你想让树使用它们。但是现在你必须告诉我更多-你所说的导线测量到底是什么意思?通过ID获取节点,或者向下/向上/跨一定距离移动?如果你在寻找二叉树的效率,那就意味着根据节点的条件来寻找节点——例如,不是“找到节点ID为a的节点”,而是“找到位于真/真/假/真/假的节点”。好吧,你为什么不告诉我你想要的最终结果是什么,我们就从那里开始工作?对我来说,这听起来像是你想要一个由ID为字符串的节点组成的树,并且你想要能够以二叉树的效率通过nodeId进行搜索。对吗?这就是你想要的一切吗?
    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:[]}
    ]};