diff --git a/chapter04/4.05 - Validate BST/validateBST.js b/chapter04/4.05 - Validate BST/validateBST.js index c3e9a96..26bc875 100644 --- a/chapter04/4.05 - Validate BST/validateBST.js +++ b/chapter04/4.05 - Validate BST/validateBST.js @@ -4,23 +4,29 @@ var BinaryTree = function(value) { this.right = null; }; -var validateBST = function(bt) { - // traverse the tree depth first, while - // using a array with stack like behavior to check each node's validity - // * assume values do not repeat - var validateRecurse = function(currBt, stackArr) { - for (var i = 0; i < stackArr.length; i++) { - if (stackArr[i].side === 'left' && currBt.value > stackArr[i].node.value) { - return false; - } else if (stackArr[i].side === 'right' && currBt.value < stackArr[i].node.value) { - return false; - } +var validateBST = function(tree) { + + var validateRecurse = function(tree, min, max) { + if (tree === null) { + return true; + } + + if (tree.value <= min || tree.value >= max) { + return false; + } + + if (!validateRecurse(tree.left, min, tree.value)) { + return false; + } + + if (!validateRecurse(tree.right, tree.value, max)) { + return false; } - var left = currBt.left === null ? true : validateRecurse(currBt.left, stackArr.concat([{ node:currBt, side:'left'}])); - var right = currBt.right === null ? true : validateRecurse(currBt.right, stackArr.concat([{ node:currBt, side:'right'}])); - return true && left && right; + + return true; }; - return validateRecurse(bt, []); + + return validateRecurse(tree, -Infinity, Infinity); }; /* TESTS */