/** * 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} */ const isValidBST = function (root) { }; /* 思路:根据二叉搜索树的定义,BST的中序遍历是一个严格的递增序列,所以只要一次遍历,判断后一个树是否是严格大于当前的树,如果小于等于, 那么这个二叉树不是搜索二叉树 */ function f1(root) { let prev = null; // 前一个节点的值 const inordertraversal = (node) => { if (!node) return true; // 空节点被视为有效BST // 遍历左子树如果左子树不是BST立即返回false if (!inordertraversal(node.left)) return false; // 处理当前节点 if (prev !== null && prev >= node.val) return false; // 更新prev为当前节点值 prev = node.val; // 遍历右子树 return inordertraversal(node.right); }; return inordertraversal(root); } /* 使用迭代法中序遍历,返回更直接 */ function f2(root) { const stack = []; let prev = null; // 迭代法中序遍历 while (stack.length > 0 || root !== null) { // 遍历左子树,直到最左叶子节点 while (root !== null) { stack.push(root); root = root.left; } // 访问当前节点 root = stack.pop(); // 当前节点值必须大于前一个节点值 if (prev !== null && root.val <= prev) { return false; // 发现不符合要求,返回false } // 更新prev为当前节点值 prev = root.val; // 访问右子树 root = root.right; } return true; }