JavaScript-如何在节点搜索中返回树的分支?
我的数据结构如下所示:JavaScript-如何在节点搜索中返回树的分支?,javascript,algorithm,recursion,tree,Javascript,Algorithm,Recursion,Tree,我的数据结构如下所示: var tree = [ { id: 1, children: [] }, { id: 2, children: [ { id: 3, children: [] } ] } ]; 一个分支上可以有任意数量的节点或子节点 我的目标是从顶部(根)节点开始,搜索给
var tree = [
{
id: 1,
children: []
}, {
id: 2,
children: [
{
id: 3,
children: []
}
]
}
];
一个分支上可以有任意数量的节点或子节点
我的目标是从顶部(根)节点开始,搜索给定节点并返回它所在的分支
在Plunker的例子中:
我想搜索节点id#31,因此算法将返回31所属的数组(分支)
我已经开始了这个算法,但是如果我递归地这样做,我不知道如何再次回溯
function traverse(branch) {
for (var i = 0; i < branch.length; i++) {
if (branch[i].id == node.id) {
return branch;
}
}
for (var j = 0; j < branch.length; j++) {
if (branch[j].children.length > 0) {
return traverse(branch[j].children);
}
}
}
console.log(traverse(tree));
函数遍历(分支){
对于(变量i=0;i0){
返回遍历(分支[j].子级);
}
}
}
console.log(遍历(树));
例如,如果我向下查看最后一个子节点而没有找到匹配项,那么我需要回溯到父分支以尝试下一组选项
如何修改算法以再次回溯?您的算法非常接近,您只需添加一个
if
语句,以便它仅在找到匹配项时返回遍历的递归结果:
function traverse(branch) {
for (var i = 0; i < branch.length; i++) {
if (branch[i].id == node.id) {
return branch;
}
}
for (var j = 0; j < branch.length; j++) {
var result = traverse(branch[j].children);
if (result !== undefined) {
return result;
}
}
return undefined; // no match found
}
console.log(traverse(tree));
函数遍历(分支){
对于(变量i=0;i
您可以对子项的结果使用临时变量,如果值为truthy,则退出循环
function traverse(branch) {
var result;
for (var i = 0; i < branch.length; i++) {
if (branch[i].id === node.id) {
return branch;
}
if (branch[j].children.length > 0) {
result = traverse(branch[j].children);
if (result) {
return result;
}
}
}
}
函数遍历(分支){
var结果;
对于(变量i=0;i0){
结果=遍历(分支[j]。子级);
如果(结果){
返回结果;
}
}
}
}
这样做的目的是返回分支而不是节点本身:
function traverse(branch) {
for (var i = 0; i < branch.length; i++) {
if (branch[i].id == node.id) {
return branch[i].children;
}
}
for (var j = 0; j < branch.length; j++) {
var result = traverse(branch[j].children);
if (result !== null) {
return result;
}
}
return null; // no match found
}
函数遍历(分支){
对于(变量i=0;i
如果找不到匹配项,您希望返回什么?如果递归调用找到某个内容,则只应返回其结果。在我的情况下,将始终找到匹配项,因为我将让用户单击其中一个以启动搜索过程。当然,但如果要使代码递归,则必须预期树的每个分支都不会包含匹配项,因此,在这种情况下,您必须返回一些内容。我如何修改算法,使其能够找到多个匹配项而不是一个匹配项?您需要将推入结果的数组中,然后在最后返回结果。