LeetCode : 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.

代码:
在这里插入图片描述
在这里插入图片描述
对二叉搜索树验证,我们不仅要验证左子节点<父节点<右子节点,其实父节点的父节点还为右边提供了一个下界,为左边提供了一个上界。如图中4位置要求是大于5的。

/**
 * 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) {
        if(root==null) return true;
        
        Stack<TreeNode> sta = new Stack<>();
        Stack<Integer> up = new Stack<>();
        Stack<Integer> low = new Stack<>();
        sta.push(root);
        up.push(null);
        low.push(null);
        
        while(!sta.isEmpty()){
            TreeNode cur = sta.pop();
            Integer lower = low.pop();
            Integer upper = up.pop();
            if(cur.left!=null){
                if(cur.left.val>=cur.val) return false;
                if(lower!=null && cur.left.val<=lower) return false;
                sta.push(cur.left);
                low.push(lower);
                up.push(cur.val);
            }
            if(cur.right!=null){
                if(cur.right.val<=cur.val) return false;
                if(upper!=null && cur.right.val>=upper) return false;
                sta.push(cur.right);
                low.push(cur.val);
                up.push(upper);
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_16234613/article/details/89388385