zoukankan      html  css  js  c++  java
  • 98. Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST).

    Assume a BST is defined as follows:

    • The left subtree of a node contains only nodes with keys less than the node's key.
    • The right subtree of a node contains only nodes with keys greater than the node's key.
    • Both the left and right subtrees must also be binary search trees.

    Example 1:

    Input:
        2
       / 
      1   3
    Output: true
    

    Example 2:

        5
       / 
      1   4
         / 
        3   6
    Output: false
    Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value
                 is 5 but its right child's value is 4.

    M1: recursion

    给每个节点定义一个区间,如果节点的值落在区间外,返回false,否则继续递归左右节点,区间上下限相应调整

    注意!!min, max如果用int会溢出,要用long

    time: O(n), space: O(n)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isValidBST(TreeNode root) {
            return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE);
        }
        
        public boolean isValid(TreeNode node, long min, long max) {
            if(node == null) {
                return true;
            }
            
            if(node.val <= min || node.val >= max) {
                return false;
            }
            return isValid(node.left, min, node.val) && isValid(node.right, node.val, max);
        }
    }

    M2: iteration using inorder traversal

    用一个指针时刻记录root移动前的状态,因为BST的inorder traversal是升序,如果prev.val >= cur.val,返回false;否则继续遍历

    time = O(n), space = O(n) worst case

    class Solution {
        public boolean isValidBST(TreeNode root) {
            if(root == null) {
                return true;
            }
            LinkedList<TreeNode> stack = new LinkedList<>();
            TreeNode prev = null, cur = root;
            while(!stack.isEmpty() || cur != null) {
                while(cur != null) {
                    stack.offerFirst(cur);
                    cur = cur.left;
                }
                cur = stack.pollFirst();
                if(prev != null && prev.val >= cur.val) {
                    return false;
                }
                prev = cur;
                cur = cur.right;
            }
            return true;
        }
    }
  • 相关阅读:
    python kivy 简单入门
    django 入门实例
    window docker安装
    apache进程和用户请求的关系
    php cookie工作原理
    react-router 简单的nginx配置
    node单线程支撑高并发原理(node异步I/O)
    知识图谱
    java
    java
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10201423.html
Copyright © 2011-2022 走看看