如何编写此JavaScript代码以查找树是否是更少行中的二叉搜索树?

时间:2017-07-27 14:35:46

标签: javascript algorithm binary-search-tree

在我的Javascript类的测验中,我们被告知要创建一个简单的树并编写一个返回true或false的函数,无论它是否为BST。

我得到了不错的分数,但我得到了10分,因为教练说“这可以用6行来完成。”

这就是我所拥有的:

function node(value, left, right){
    this.Value = value;
    this.Left = left;
    this.Right = right;
}

//this IS a BST, returns true
var head = new node(8, new node(9, null, null), new node(10, new node(9, null, null), new node(14, new node(13, null, null), null)));


function isBST(currNode){
    if(currNode.Left === null && currNode.Right === null){
        return true;
    }
    else if(currNode.Left.Value > currNode.Value || currNode.Right.Value < currNode.Value){
        return false;
    }
    else{
        if(currNode.Left === null){
            return isBST(currNode.Right);
        }
        else if(currNode.Right === null){
            return isBST(currNode.Left);
        }
        else{
            return (isBST(currNode.Left) && isBST(currNode.Right));
        }
    }
}


console.log(isBST(head));

我在这里俯瞰的一切?也许它不应该是递归的?

2 个答案:

答案 0 :(得分:3)

您当前功能的问题在于它不起作用。它返回true:

     4
    / \
   3   5
  / \
 2  100

此时所有其他答案似乎都有同样的问题。这是一个有效且短得多的

function isBST(curNode, minval, maxval){
    if (curNode == null) {
        return true;
    }
    return (
        (minval == null || minval <= curNode.Value) &&
        (maxval == null || maxval >= curNode.Value) &&
        isBST(curNode.Left, minval, curNode.Value) &&
        isBST(curNode.Right, curNode.Value, maxval)
    );
}

答案 1 :(得分:1)

如果你的老师都担心的是行数......我会认为他们是一个坏老师......

话虽如此......我并不是说你的代码是正确的,但这里是你的代码减去无关的返回语句,行数少于6行。

function node(value, left, right){
    this.Value = value;
    this.Left = left;
    this.Right = right;
}

//this IS a BST, returns true
var head = new node(8, new node(9, null, null), new node(10, new node(9, null, null), new node(14, new node(13, null, null), null)));

function isBST(currNode){
    if(currNode.Left === null && currNode.Right === null) return true;
    if(currNode.Left.Value > currNode.Value || currNode.Right.Value < currNode.Value) return false;
    if(currNode.Left === null) return isBST(currNode.Right);
    if(currNode.Right === null) return isBST(currNode.Left);
    return (isBST(currNode.Left) && isBST(currNode.Right));
}

console.log(isBST(head));

撇开:详细的可读代码胜过少行,难以阅读 99.99%的时间。 0.01%是因为你是一个坏老师的班级,他更关心行数,而不是实际看你的作业。

除了#2 :为了便于阅读,通常应将长度超过约80个字符的行拆分为多行。没有人喜欢阅读一长串代码。

编辑:对于在示例@ stanford.edu

之后建模的真实BST
var head = new node(5,
    new node(3,
        new node(1, null, null),
        new node(4, null, null)
    ),
    new node(9,
        new node(6, null, null),
        null
    )
);