[英]How is the recursion of in-order, pre-order and post-order working in this Binary Search Tree (JavaScript) code?
[英]JavaScript Binary Search Tree in-order traversal returning undefined as part of answer
我正在为JS中的BST编写递归的有序遍历方法。 该方法应该在数组内按顺序返回数值叶值。 到目前为止,我的书面方法就是如此。 但是除了有序数字之外,它还会在我的数组末尾返回3'undefined'。 我的in order方法的代码在这里:
this.inorder = function(){
let travArr = [];
function recurTrav(node){
if(node.left == null && node.right == null){
console.log("leaf: " + node.value);
return node.value;
}
else if(node.right == null){
console.log("right is null, val: " + node.value);
travArr.push(recurTrav(node.left));
travArr.push(node.value);
}
else if(node.left == null){
console.log("left is null, val:" + node.value);
travArr.push(node.value);
travArr.push(recurTrav(node.right));
}
else{
console.log("no nulls:");
travArr.push(recurTrav(node.left));
travArr.push(node.value);
travArr.push(recurTrav(node.right));
}
}
recurTrav(this.root);
return travArr;
}
this.root是BST的根节点。 为简单起见,我有一个我没有包含的添加方法。 节点具有值,左和右属性。
如果我按顺序将.inorder()
到我的BST,我的.inorder()
方法将返回[2, 3, 5, 6, 8, 14, undefined, undefined, undefined]
.inorder()
[2, 3, 5, 6, 8, 14, undefined, undefined, undefined]
某些原因。 我无法弄清楚那3个未定义的来自哪里。 我想这可能是因为我的travArr.push(),它可能会返回'undefined'。
我意识到我可能只是做一些数组操作来取消那些'未定义',但我真的想要了解我的代码编写错误。 如果我的BST包含我的完整代码更容易,请告诉我,我会将其包括在内。
您可以查看此部分:
function recurTrav(node) {
if (node.left == null && node.right == null){
console.log("leaf: " + node.value);
return node.value; // returns a value
} else if(node.right == null){
console.log("right is null, val: " + node.value);
travArr.push(recurTrav(node.left)); // <------ could take undefined
travArr.push(node.value); // no return until end of funct
}
//..
// missing return, takes default return value.
}
解决方案:仅在必要时按下并调用功能而不使用推送结果。
function recurTrav(node) {
if (!node.left && !node.right) { // falsy check incl undefined/null
console.log("leaf: " + node.value);
travArr.push(node.value);
return; // omit else parts
} // with early returns
if (!node.right) {
console.log("right is null, val: " + node.value);
recurTrav(node.left);
travArr.push(node.value);
return;
}
if (!node.left) {
console.log("left is null, val:" + node.value);
travArr.push(node.value);
recurTrav(node.right);
return;
}
console.log("no nulls:");
recurTrav(node.left);
travArr.push(node.value);
recurTrav(node.right);
}
给出一个简单的Node
构造函数
class Node
{ constructor (value, left, right)
{ this.value = value
this.left = left
this.right = right
}
}
还有一个简单的Tree
构造函数
class Tree
{ constructor (root)
{ this.root = root
}
...
}
我们可以实现Tree#inorder
无需为null检查left
和right
分别分支
inorder ()
{ if (this.root === undefined)
return []
else
return [ ...new Tree (this.root.left).inorder ()
, this.root.value
, ...new Tree (this.root.right).inorder ()
]
}
运行下面的完整程序,在您自己的浏览器中验证结果
class Node { constructor (value, left, right) { this.value = value this.left = left this.right = right } } class Tree { constructor (root) { this.root = root } inorder () { if (this.root === undefined) return [] else return [ ...new Tree (this.root.left).inorder () , this.root.value , ...new Tree (this.root.right).inorder () ] } } const n = new Node ( 3 , new Node ( 2 , new Node (1) , undefined ) , new Node ( 6 , new Node ( 4 , undefined , new Node (5) ) , new Node (7) ) ) const t = new Tree (n) console.log (t.inorder ()) // [ 1, 2, 3, 4, 5, 6, 7 ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.