美文网首页
LeetCode-98-验证二叉搜索树

LeetCode-98-验证二叉搜索树

作者: 蒋斌文 | 来源:发表于2021-06-04 10:07 被阅读0次

    LeetCode-98-验证二叉搜索树

    98. 验证二叉搜索树

    难度中等

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:

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

    示例 1:

    输入:
        2
       / \
      1   3
    输出: true
    

    示例 2:

    输入:
        5
       / \
      1   4
         / \
        3   6
    输出: false
    解释: 输入为: [5,1,4,null,null,3,6]。
         根节点的值为 5 ,但是其右子节点值为 4 。
    

    思路

    中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。

    class Solution {
    
        long pre = Long.MIN_VALUE;
        public boolean isValidBST(TreeNode root) {
            if (root == null) {
                return true;
            }
            // 访问左子树
            if (!isValidBST(root.left)) {
                return false;
            }
            // 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
            if (root.val <= pre) {
                return false;
            }
            pre = root.val;
            // 访问右子树
            return isValidBST(root.right);
    
        }
    }
    

    非递归

    class Solution {
    
        long pre = Long.MIN_VALUE;
        public boolean isValidBST(TreeNode root) {
            TreeNode cur= root;
           
             Stack<TreeNode> stack = new Stack<TreeNode>();
             while (!stack.isEmpty() || cur != null) {
                if (cur != null) {//cur 不为null push
                   stack.push(cur);
                   cur = cur.left;
                } else {//遇到NULL pop  cur = cur.right;
                   cur = stack.pop();
                   if(cur.val<=pre) {
                       return false;
                   }
                   pre = cur.val;
                   cur = cur.right;
                }
             }
           
            return true;
    
        }
    }
    
    image-20210604100435215
    class Solution {
    
        public boolean isValidBST(TreeNode root) {
            if (root == null) {
                return true;
            }
            TreeNode cur = root;
            TreeNode mostRight = null;
            Integer pre = null;
            boolean ans = true;
            while (cur != null) {
                mostRight = cur.left;
                if (mostRight != null) {
                    while (mostRight.right != null && mostRight.right != cur) {
                        mostRight = mostRight.right;
                    }
                    if (mostRight.right == null) {
                        mostRight.right = cur;
                        cur = cur.left;
                        continue;
                    } else {
                        mostRight.right = null;
                    }
                }
                if (pre != null && pre >= cur.val) {
                    ans = false;
                }
                pre = cur.val;
                cur = cur.right;
            }
            return ans;
        }
    }
    
    image-20210604100640772

    相关文章

      网友评论

          本文标题:LeetCode-98-验证二叉搜索树

          本文链接:https://www.haomeiwen.com/subject/cblxeltx.html