我有这样的数组树:
[ {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
是否有任何算法可以帮助我排除不必要的分支?有什么想法吗?
祝你好运
答案 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(' ');
showTree('Tree 2', 2);