当前位置: 首页 > 知识库问答 >
问题:

右子树递归

湛文乐
2023-03-14

为了更灵活地编写代码,我每天都在尝试做不同的问题,但这一次却让我停滞不前。

下面的代码应该是在预序遍历中从给定的字符串建立一个二叉树。即“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);
}

共有1个答案

陶温书
2023-03-14

我不明白您的错误,因为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
        }
    }
}

这似乎是你想要的结果

我们可以做一些“更简单”的事情

  1. 防止自己进行无用的缩进

特别是对于递归条件下的停止,最好先写它们

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没有任何孩子)。 这是我的代码: 我在纸上运行