簡體   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