簡體   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