В викторине для моего класса 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));
Что-нибудь я здесь не замечаю? Может быть, это не должно было быть рекурсивным?
Проблема с вашей текущей функцией в том, что она не работает. Он возвращает 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)
);
}
Если все ваши учителя беспокоятся, это количество строк... Я считаю их плохой учитель...
Это сказано... Я не говорю, что ваш код правильный, но вот ваш код минус посторонний оператор возврата, содержащий более 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 символов обычно должна быть разделена на несколько строк для удобства чтения. Никто не любит читать одну длинную строку кода.
EDIT: для реального BST, смоделированного после примера @stanford.edu
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
)
);
else
недоступен.