Javascript 如何更改二叉树索引中递归的保留?

Javascript 如何更改二叉树索引中递归的保留?,javascript,json,recursion,binary-tree,Javascript,Json,Recursion,Binary Tree,我用JavaScript编写了代码,允许生成任何二叉树(每个父级有2个子级) 用户可以通过名为“levels”的变量指定他想要的树的级别 代码: 例如,“levels”=3时,该树如下所示: 树中的每个对象都有: -name-架构中的第一个字段,它应该包括对象的ID -键入-第二个字段,它包含有关对象级别的信息 -properties-nevermind -儿童 它工作得很好,但我真的想更改对象索引。 这棵树应该是这样的: 所以索引应该从左到右。 我该怎么做?也许循环会更好吗?如果在添加下面

我用JavaScript编写了代码,允许生成任何二叉树(每个父级有2个子级)

用户可以通过名为“levels”的变量指定他想要的树的级别

代码:

例如,“levels”=3时,该树如下所示:

树中的每个对象都有:

-name-架构中的第一个字段,它应该包括对象的ID

-键入-第二个字段,它包含有关对象级别的信息

-properties-nevermind

-儿童

它工作得很好,但我真的想更改对象索引。 这棵树应该是这样的:

所以索引应该从左到右。
我该怎么做?也许循环会更好吗?

如果在添加下面的级别之前添加直接子级,那么将以广度优先而不是深度优先的方式进行。我已将对
属性的调用替换为下面的
未定义
,因为它不包含在您问题的代码片段中

函数树节点(名称、类型、属性、子级){
this.name=名称;
this.type=type;
这个。属性=属性;
这个。孩子=孩子;
}
风险值水平=3;
prop=未定义;//财产(“对象1”);
变量树=新树节点(“对象1”,“级别1”,属性[]);
级别--;
var指数=2;
函数GenerateArbitraryLevel(父级、级别维护){
//末级
如果(levelsRemaining==0)返回;
var currentLevel=parseInt(parent.type.split(“”“)[1])+1;
var prop1=undefined;//属性(“对象”+tempIndex);
父、子、推(
新的TreeNode(“Object_u“+tempIndex++”,“level_“+currentLevel,prop1,[]))
);
var prop2=undefined;//属性(“对象”+tempIndex);
父、子、推(
新的TreeNode(“Object_u“+tempIndex++”,“level_“+currentLevel,prop2,[]))
);
GenerateArbitraryLevel(父级.children[0],levelsMaining-1);
GenerateArbitraryLevel(父级、子级[1],levelsMaining-1);
}
GenerateArbitraryLevel(树、级别);
tree=JSON.stringify([tree]);
//检查树是否符合预期

控制台日志(树)我相信您正在寻找的是
宽度优先
,而不是您已经实现的
深度优先
。查看下面的链接以获取有关树中广度优先算法的更多信息

关于用例的示例实现,您可以参考下面的代码

const TreeNode=(名称、类型、属性、子项)=>({
名称
类型,
属性,
儿童
});
const getNode=(索引、级别、属性)=>{
const name=`Object_${index}`;
常量类型=`level_${level}`;
返回树节点(名称、类型、属性[名称],]);
};
const generateTreeChildren=(节点、currentLevel、MaxLevel、索引、属性)=>{
如果(currentLevel>MaxLevel){
返回null;
}
const child1=getNode(索引、当前级别、属性);
const child2=getNode(索引+1,当前级别,属性);
node.children=[child1,child2];
generateTreeChildren(child1,currentLevel+1,MaxLevel,索引+2,属性);
generateTreeChildren(child2,currentLevel+1,MaxLevel,索引+4,属性);
};
const generateTree=(最大级别,属性)=>{
如果(MaxLevel==0){
返回null;
}
const node=getNode(1,1,属性);
generateTreeChildren(节点,2,最大级别,2,属性);
返回节点;
};

console.info(JSON.stringify(generateTree(3,{}))不幸的是,该解决方案不够好,仍然是相同的索引-首先是分支索引。它进入最深的层次,下一个分支等。。。我真的很想从左到右建立索引(级别索引)。左边的分支应该只包含两(2^n)的幂,右边的分支应该只包含2^(n+1)-1对象索引似乎与第二个图匹配,即对象1是级别1,对象2-对象3是级别2,对象4-对象7是级别3?是的,但是如果级别>3,树就不是它应该的样子。索引应该是广度优先而不是深度优先不幸的是,每个级别都应该有2^级对象,每个级别中的索引都应该是范围:左边的分支应该只包含2(2^n)的幂,右边的分支应该只包含2^(n+1)-1是,这就是广度优先方法的用途。你试过上面的代码了吗?好的,我在你的代码中更改了两行:
generateTreeChildren(child1,currentLevel+1,maxLevels,2*index,properties);generateTreeChildren(child2,currentLevel+1,MaxLevel,2*索引+2,属性)现在它可以按照我的要求工作了。谢谢。好的,在上面的代码中,属性应该是一个对象,因此您可能需要修改该部分,并且无论在哪里使用属性,您都需要调用您的函数
function TreeNode(name, type, properties, children) {
    this.name = name;
    this.type = type;
    this.properties = properties;
    this.children = children;
}

var levels = 3;


prop = properties("Object_1");

var tree = new TreeNode("Object_1", "level_1", prop, []);

levels--;

var tempIndex = 2;

function generateArbitraryLevels(parent, levelsRemaining) {
    // last level
    if (levelsRemaining === 0) return;

    var currentLevel = parseInt(parent.type.split('_')[1]) + 1;
    var prop1 = properties("Object_" + tempIndex);

    parent.children.push(
        new TreeNode("Object_" + tempIndex++, "level_" + currentLevel, prop1, [])
    );


    generateArbitraryLevels(parent.children[0], levelsRemaining - 1);

    var prop2 = properties("Object_" + tempIndex);

    parent.children.push(
        new TreeNode("Object_" + tempIndex++, "level_" + currentLevel, prop2, [])
    );
    generateArbitraryLevels(parent.children[1], levelsRemaining - 1);

}

generateArbitraryLevels(tree, levels);
tree = JSON.stringify([tree]);