来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/validate-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
解答
需要注意的是:
- 所有的左子节点都小于当前节点
所有的右子节点都大于当前节点
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*//*** @param {TreeNode} root* @return {boolean}*/var isValidBST = function(root) {let isValid = true;function traverse (node) {if (!node) return;const val = node.val;if (!node.left && !node.right) {return [ val ];}let leftNodes = traverse(node.left) || [];let rightNodes = traverse(node.right) || [];for (let i = 0, len = leftNodes.length; i < len; i++) {if (leftNodes[i] >= val) {isValid = false;}}for (let i = 0, len = rightNodes.length; i < len; i++) {if (rightNodes[i] <= val) {isValid = false;}}return [...leftNodes, val, ...rightNodes];}traverse(root);return isValid;};
优化
把每个节点的范围区间利用闭包传进去
var isValidBST = function(root) {return helper(root, -Infinity, Infinity);}function helper (node, low, high) {if (!node) return true;if (node.val <= low || node.val >= high) return false;return helper(node.left, low, node.val) && helper(node.right, node.val, high);}
