使用数组表示形成树,并选择root

时间:2017-09-01 10:51:34

标签: javascript arrays tree

我有这样的数组树:

[ {val: 10,index: 0},{val: 20,index: 1},{val: 30,index: 2},{val: 40,index: 5} ]

我使用索引创建树(0是root),我的结果是:

   50                     
     \
20    30
 \    /
   10

索引:(现在我希望能理解这一点:))

  3   4   5    6               
   \ /     \  /
    1       2
     \    /
       0

现在我遇到从api

获取树的索引问题

当我尝试树/ 0时没关系,返回上面这棵树但是当我尝试树/ 1时 我只想要

20

或tree / 2

   50
     \
     30

是否有任何算法可以帮助我排除不必要的分支?有什么想法吗?

祝你好运

2 个答案:

答案 0 :(得分:1)

如果按以下方式定义树,

指数i = 2 * i + 1和2 * i + 2

的儿童

然后你可以执行深度优先搜索来打印索引产生的分支,直到它到达叶子,所以

DFS(1) -> DFS(3)

你会得到50和30

DFS(i) // would call
DFS(2*i+1) and DFS(2*i+2)

答案 1 :(得分:1)

作为没有任何父级的平面数组,您实际上没有树结构。

但使用Object的Javascript中的树结构非常容易。

以下是一个示例 - >

/*
  3   4   5    6               
   \ /     \  /
    1       2
     \    /
       0
*/

var tree = {
  index: 0,
  val: 'Root',
  nodes: [
    {
      index: 1,
      val: 'Value 1',
      nodes: [
        {  
          index: 3,
          val: 'Value 3'
        }, {
          index: 4,
          val: 'Value 4'
        }
      ]
    }, {
      index: 2,
      val: 'Value 2',
      nodes: [
        {  
          index: 5,
          val: 'Value 5'
        }, {
          index: 6,
          val: 'Value 6'
        }
      ]
    }
  ]
};

function display(s) {
  document.write('<div>' + s + '</div>');
}

function find(root, index) {
  if (root.index === index) return root;
  if (root.nodes) {
    for (let l = 0; l < root.nodes.length; l ++) {
      let node = root.nodes[l];
      if (node.index === index) return node;
      node = find(node, index);
      if (node) return node;
    }      
  }
  return null;
}

function treeSize(tree) {
  let size = 0;
  if (tree.nodes)
    for (let l = 0; l < tree.nodes.length; l ++)
      size += treeSize(tree.nodes[l]);
  return size + 1;   
}

function showTree(name, index) {
  let node = find(tree, index);
  if (!node) return;
  display(name + '-> Size: ' + treeSize(node));
  function draw(node, indent) {
    display(indent + node.val);
    if (node.nodes) {
      for (let l = 0; l < node.nodes.length; l ++)
        draw(node.nodes[l], indent + '----');
    }
  }
  draw(node, '');
}

showTree('Tree 0', 0);
display('&nbsp;');
showTree('Tree 2', 2);