[英]JS Depth First Traversal Pre-Order
就像一个练习一样,我正在编写JavaScript以在二叉搜索树上进行Depth First Traversal
的pre-order
排序。
注意:这是迭代,不是递归。 我可以递归地执行它,但是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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.