为了更灵活地编写代码,我每天都在尝试做不同的问题,但这一次却让我停滞不前。
下面的代码应该是在预序遍历中从给定的字符串建立一个二叉树。即“5 3 1 N N N 7 N N”表示下面的二叉树。元素之间用空格分隔,N标记空节点,空节点正好为NULL。
5
/ \
3 7
/
1
它应该像遍历拆分的字符串一样简单,当找到“n”
以外的东西时,就用该值构造一个节点
,并增加索引
。
增加index
之后,我再次将下一个数组元素放入左侧子树中。如果遇到“n”
,则不需要执行任何操作,因为节点
的构造函数已经将左子级设置为null,因此我只增加索引
。理论上,正确的节点
应该在前面的递归步骤中分配...但不知怎的,这就失败了?
是因为JavaScript的异步行为吗?我错过了什么?
提前感谢您的帮助!
class Node {
constructor(val) {
this.val = val;
this.left = this.right = null;
}
}
class Index {
constructor() {
this.index = 0;
}
incr() {
this.index++;
}
}
function deserialize(treeString) {
let treeArray = treeString.split(" ");
let index = new Index();
let length = treeArray.length;
function helper(index) {
if (index.index < length) {
let node = null;
if (treeArray[index.index] !== "N") {
node = new Node(parseInt(treeArray[index.index], 10));
index.incr();
node.left = helper(index);
node.right = helper(index);
} else {
index.incr();
}
return node;
};
}
return helper(index);
}
我不明白您的错误,因为console.log(json.stringify(deserialize('5 3 1 N N N 7 N N'),null,1))
给了我
{
"val": 5,
"right": {
"val": 7,
"right": null,
"left": null
},
"left": {
"val": 3,
"right": null,
"left": {
"val": 1,
"right": null,
"left": null
}
}
}
这似乎是你想要的结果
我们可以做一些“更简单”的事情
特别是对于递归条件下的停止,最好先写它们
function recurse(){
if (index.index == length) {
//stop code
return
}
//your other conditions...
//your code which will call recurse
}
2.1这里的“迭代器”没用
由于您仍然依赖于了解您的结构(treeArray必须“实现”运算符[]),因此使用哑变量至少会减少代码
2.2如果您真想使用迭代器
您可以看到,无论在if或else路径中,您都包含(这相当于“在treearray中前进”)。所以只需在TreeArray上迭代即可。下面我们“pop”元素(向前)
function helper(arr){
if end
return
let currentNodeVal = arr.shift() //advance in treeArray
if (currentNodeVal !== "N") {
node = new Node(parseInt(currentNodeVal, 10));
node.left = helper(arr);
node.right = helper(arr);
} else {
//nothing to do
}
}
这里实际上没有任何异步代码在运行。如果您命名为
helperinfty = function(){
while(true){}
}
node.left = helperinfty(arr)
node.right = helper(arr);
您可以观察到node.right=helper(arr)
从未执行过。当您使用settimeout
等时(简单地说,当函数需要回调来同步流时),您就会得到“时髦”的东西(答案是否定的)
打印与开头相同的树
class Node {
constructor(val) {
this.val = val;
this.left = this.right = null;
}
}
function deserialize(treeString) {
let arr = treeString.split(" ");
function helper(arr) {
if(arr.length == 0)return null;//note that in previous implem helper "could" return undefined...which is not something desired
let current = arr.shift();
if (current == "N"){
//this is a matter of preference. Arguably one can prefer your style.
//I prefer to emphase that when N is found it is meant to be a null node, and "abort" any recursion
return null
}
let node = new Node(parseInt(current, 10));
node.left = helper(arr);
node.right = helper(arr);
return node;
}
return helper(arr);
}
x = deserialize('5 3 1 N N N 7 N N');
console.log(JSON.stringify(x, null, 4))
问题内容: 我是mysql的新手。这是我的桌子: 类别表: 每个类别都有一个父项,我想准备它们以显示在下拉菜单中。 这就是我想要得到的: 在这里,类别没有顺序,我的代码必须为远离父母的孩子类别提供顺序。根据每个类别的父母的深度提供姓名前的缩进。每个类别的孩子数没有限制,但是类别总数不超过100。 有没有查询可以给出这样的结果?我更喜欢可以在PHP框架中以活动记录形式运行的查询。 问题答案: 这个
我只是在玩一个二叉树,我很好奇为什么第一个实现有效,而第二个没有。我忽略了什么?我觉得这很琐碎,但我还是很怀念。 不起作用的变体: Node只是一个简单的类,包含public成员和一个数据成员。没什么特别的。所以#1工作得很好,按序遍历产生一个排序的输出。现在#2似乎不起作用了。根是唯一被初始化的根,其左/右子级继续为空。所以如果我通过作为参数,为什么递归方法调用不为其分配新节点?我错过了什么?J
试图遍历一棵树并为我的数组获取空值。我需要遍历只允许访问节点类的类定义中没有根的右和左子级的树。 它需要输入 这应该返回[1,2,4,3,5],我得到了[]。我也尝试过像这样循环 这也不管用。这也会给我一个[]数组。遍历应该从左到右在树高(即树高)指示的树级别上打印树。有什么想法吗?
我有TreeNode类——非二叉树(
通常我们按顺序、前顺序或后顺序遍历二叉搜索树。但是,当我们按照从右到根到左的递归顺序遍历二叉搜索树时,会发生什么呢? 假设如果我将值存储在数组中,并且与前序遍历相比,当我们按此顺序遍历时,它的时间复杂度是否会增加。
问题内容: 我有一个Person类,我想创建一棵树。这是Person类的解释器。 c1是左边的孩子,c2是右边的孩子。所以说我创建了三个这样的人: 因此,在这里您说亚当是根节点,亚当的左孩子是b,这是芭芭拉,他的右c是卡尔,依此类推。 所以我想做的是编写一个count方法,该方法计算包括在内的子代数。因此a.count()将返回6(如果Person f没有任何孩子)。 这是我的代码: 我在纸上运行