【LeetCode刷题记录】32.合法二叉搜索树

101 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-合法二叉搜索树

实现一个函数,检查一棵二叉树是否为二叉搜索树。

示例 1:

输入:

    2
   / \
  1   3

输出: true

示例 2:

输入:

    5
   / \
  1   4
     / \
    3   6

输出: false

解释: 输入为: [5,1,4,null,null,3,6]。

  根节点的值为 5 ,但是其右子节点值为 4 。

二、思路分析:

思路一:

中序遍历,判断是否递增

思路二:

记录最大最小值,根据BST定义判断左右子树是否均满足即可

思路三:

递归

三、AC 代码:

思路一:

    class Solution {

        long maxValue = Long.MIN_VALUE;

        public boolean isValidBST(TreeNode root) {
            if (root == null) {
                return true;
            }
            if (isValidBST(root.left)) {
                if (root.val <= maxValue) {
                    return false;
                }
                maxValue = root.val;
                return isValidBST(root.right);
            }
            return false;
        }
    }

思路二:

    class Solution {

        public boolean isValidBST(TreeNode root) {
            return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
        }

        private boolean dfs(TreeNode rootNode, long minValue, long maxValue) {
            if (rootNode == null) {
                return true;
            }
            if (rootNode.val >= maxValue || rootNode.val <= minValue) {
                return false;
            }
            return dfs(rootNode.left, minValue, rootNode.val) && dfs(rootNode.right, rootNode.val, maxValue);
        }

思路三:

    class Solution {
        public boolean isValidBST(TreeNode root) {
            if (root == null) {
                return true;
            }
            if (root.left == null && root.right == null) {
                return true;
            }

            return root.val > getMaxNode(root.left) && root.val < getMinNode(root.right)
                    && isValidBST(root.left) && isValidBST(root.right);
        }

        public double getMaxNode(TreeNode rootNode) {
            if (rootNode == null) {
                return -Double.MAX_VALUE;
            }

            if (rootNode.right == null) {
                return rootNode.val;
            }

            return getMaxNode(rootNode.right);
        }

        public double getMinNode(TreeNode rootNode) {
            if (rootNode == null) {
                return Double.MAX_VALUE;
            }

            if (rootNode.left == null) {
                return rootNode.val;
            }

            return getMinNode(rootNode.left);
        }
    }

四、总结:

中序遍历:

二叉搜索树的特性之一就是中序遍历是升序。

那么在中序遍历的过程中,如果非升序的情况出现直接返回false。

定义pre指针,来存放中序遍历过程中的,上一个节点的地址。

DFS递归:

二叉搜索树的特点: 左 < 根 < 右

那么在遍历的过程中,把当前节点的左右边界找出来,只要超出边界情况,直接返回false