题目描述

原题链接

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:
image.png
输入:root = [2,1,3]
输出:true

示例 2:
image.png
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

    个人解法

Javascript

  1. /*
  2. * @lc app=leetcode.cn id=98 lang=javascript
  3. *
  4. * [98] 验证二叉搜索树
  5. */
  6. // @lc code=start
  7. /**
  8. * Definition for a binary tree node.
  9. * function TreeNode(val, left, right) {
  10. * this.val = (val===undefined ? 0 : val)
  11. * this.left = (left===undefined ? null : left)
  12. * this.right = (right===undefined ? null : right)
  13. * }
  14. */
  15. const check = function (root, min = -Number.MAX_VALUE, max = Number.MAX_VALUE) {
  16. let leftRes = false;
  17. let rightRes = false;
  18. if (root.val < max && root.val > min) {
  19. if (root.left === null) {
  20. leftRes = true;
  21. } else {
  22. leftRes = root.left.val < root.val && check(root.left, min, root.val);
  23. }
  24. if (root.right === null) {
  25. rightRes = true;
  26. } else {
  27. rightRes = root.right.val > root.val && check(root.right, root.val, max);
  28. }
  29. }
  30. return leftRes && rightRes;
  31. }
  32. /**
  33. * @param {TreeNode} root
  34. * @return {boolean}
  35. */
  36. var isValidBST = function (root) {
  37. return check(root);
  38. };
  39. // @lc code=end

简化了一下

  1. const helper = (root, lower, upper) => {
  2. if (root === null) {
  3. return true;
  4. }
  5. if (root.val <= lower || root.val >= upper) {
  6. return false;
  7. }
  8. return helper(root.left, lower, root.val) && helper(root.right, root.val, upper);
  9. }
  10. var isValidBST = function(root) {
  11. return helper(root, -Infinity, Infinity);
  12. };

Java

递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public boolean isValidBST(TreeNode root) {
  18. return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
  19. }
  20. public boolean isValidBST(TreeNode node, long lower, long upper) {
  21. if (node == null) {
  22. return true;
  23. }
  24. if (node.val <= lower || node.val >= upper) {
  25. return false;
  26. }
  27. return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
  28. }
  29. }

中序遍历

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. List<Integer> tree=new ArrayList<>();
  18. public List<Integer> inorderTraversal(TreeNode root) {
  19. inorderTraversal(root,1);
  20. return tree;
  21. }
  22. public void inorderTraversal(TreeNode root,int n) {
  23. if (root==null){
  24. return ;
  25. }
  26. inorderTraversal(root.left,0);
  27. tree.add(root.val);
  28. inorderTraversal(root.right,0);
  29. }
  30. public boolean isValidBST(TreeNode root) {
  31. List<Integer> result= inorderTraversal(root);
  32. for (int i=0;i<result.size()-1;i++){
  33. if (result.get(i)>=result.get(i+1)){
  34. return false;
  35. }
  36. }
  37. return true;
  38. }
  39. }

其他解法

Java

中序遍历优化版

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. long pre = Long.MIN_VALUE; // 记录上一个节点的值,初始值为Long的最小值
  18. public boolean isValidBST(TreeNode root) {
  19. return inorder(root);
  20. }
  21. // 中序遍历
  22. private boolean inorder(TreeNode node) {
  23. if(node == null) return true;
  24. boolean l = inorder(node.left);
  25. if(node.val <= pre) return false;
  26. pre = node.val;
  27. boolean r = inorder(node.right);
  28. return l && r;
  29. }
  30. }

Javascript

中序遍历

题解链接

判断二叉树的中序遍历结果是否是有序的,如果是有序的,那么就是一个二叉搜索树

  1. var isValidBST = function(root) {
  2. let stack = [];
  3. let inorder = -Infinity;
  4. while (stack.length || root !== null) {
  5. while (root !== null) {
  6. stack.push(root);
  7. root = root.left;
  8. }
  9. root = stack.pop();
  10. // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
  11. if (root.val <= inorder) {
  12. return false;
  13. }
  14. inorder = root.val;
  15. root = root.right;
  16. }
  17. return true;
  18. };