繁体   English   中英

JavaScript二进制搜索树按顺序遍历返回undefined作为答案的一部分

[英]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检查leftright分别分支

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM