Как написать этот код JavaScript для определения, является ли дерево бинарным деревом поиска в меньшем количестве строк?

1

В викторине для моего класса 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
    Сократите это и дайте им как одну строчку ... шучу! Второй оператор возврата в вашем условии else недоступен.
  • 0
    @ Кайл Ричардсон, должен ли я изменить его на «return isBST (currNode.Left) && isBST (currNode.Right);»
Показать ещё 14 комментариев
Теги:
algorithm
binary-search-tree

2 ответа

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)
    );
}
  • 0
    за голосование, но его учитель на самом деле не смотрит на код, чтобы увидеть, работает ли он.
  • 0
    Спасибо что подметил это!
Показать ещё 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 символов обычно должна быть разделена на несколько строк для удобства чтения. Никто не любит читать одну длинную строку кода.

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
    )
);
  • 0
    спасибо за вашу помощь Кайл !!
  • 0
    пожалуйста ... в любое время!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню