Javascript JS深度优先遍历预序

Javascript JS深度优先遍历预序,javascript,python,algorithm,depth-first-search,Javascript,Python,Algorithm,Depth First Search,作为练习,我正在编写JavaScript,以便在二叉搜索树上执行深度优先遍历的预排序 注意:这是迭代,不是递归。我可以递归地做,但是Python中有迭代的方法,所以我想看看这在JS中是如何工作的 我的代码如下: var preorderTraversal = function(root) { if(!root) return []; let stack = [root]; let output = []; while(stack.length) {

作为练习,我正在编写JavaScript,以便在二叉搜索树上执行
深度优先遍历的
预排序

注意:这是迭代,不是递归。我可以递归地做,但是Python中有迭代的方法,所以我想看看这在JS中是如何工作的

我的代码如下:

var preorderTraversal = function(root) {
    if(!root) return [];
    let stack = [root];
    let output = [];

    while(stack.length) {
        root = stack.shift();
        if(root !== null) {
            output.push(root.val);
            if(root.left !== null) stack.push(root.left);
            if(root.right !== null) stack.push(root.right); //Source of the issue
        }
    }

    return output;
};
假设输入是
[1,2,3]
,这样就可以了。但是,当输入更加多样化时,如
[1,4,3,2]
,会出现问题,它返回:

[1,4,3,2]

而不是

[1,4,2,3]

因为当引擎点击上面块中标记的代码行时,它将在右侧迭代:

     1
    / \
   4   3
  /
 2
因此,不知何故,你必须通知算法不断迭代每一个左,直到没有更多的左,然后迭代右。递归地说,这相当简单

但是使用迭代,并不是很多

让我感到奇怪的是,类似的Python函数可以正常运行:

class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []

        stack, output = [root, ], []

        while stack:
            root = stack.pop()
            if root is not None:
                output.append(root.val)
                if root.right is not None:
                    stack.append(root.right)
                if root.left is not None:
                    stack.append(root.left)

        return output
显然,引起问题的语言不同,或者我在算法中的某个地方犯了错误


有谁知道有什么区别吗?我更感兴趣的是理解为什么,而不仅仅是让它工作的捷径。

多亏了评论中的帮助,这实际上是对
pop
vs
shift
方法的简单误用

Python使用的是
pop
,而我在JS中使用的是
shift
。但这意味着我们必须反转找到右值和左值的方向

因此JS代码实际上是:

var preorderTraversal = function(root) {
    if(!root) return [];
    let stack = [root];
    let output = [];

    while(stack.length) {
        root = stack.pop();
        if(root !== null) {
            output.push(root.val);
            if(root.right !== null) stack.push(root.right);
            if(root.left !== null) stack.push(root.left);
        }
    }   

    return output;
}

多亏了评论中的帮助,这实际上是对
pop
vs
shift
方法的简单误用

Python使用的是
pop
,而我在JS中使用的是
shift
。但这意味着我们必须反转找到右值和左值的方向

因此JS代码实际上是:

var preorderTraversal = function(root) {
    if(!root) return [];
    let stack = [root];
    let output = [];

    while(stack.length) {
        root = stack.pop();
        if(root !== null) {
            output.push(root.val);
            if(root.right !== null) stack.push(root.right);
            if(root.left !== null) stack.push(root.left);
        }
    }   

    return output;
}

有一件事立即引起了人们的注意:js中的
shift
与python中的
pop
。宾果,我假设pop()等同于js中的shift,但事实并非如此,因为js有一个pop()方法。现在我们必须颠倒代码检查向右和向左的顺序,它将正确地对它们进行迭代。一件马上发生的事情是js中的
shift
与python中的
pop
。宾果,我假设pop()相当于js中的shift,但当然不是,因为js有一个pop()方法。现在我们必须颠倒代码检查right和left的顺序,它将正确地迭代它们。