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

 

题目解析:

判断是否为二叉搜索树。其中的结点不能相等。


方案一:

既然递归麻烦,就利用二叉搜索树的性质,中序遍历得到有序的结果。然后再判断是否前一个值小于后一个,如果不满足就返回false。

class Solution {
public:
    bool isValidBST(TreeNode *root) {
        if(root == NULL)
            return true;

        InOrder(root);
        for(int i = 0;i < arr.size()-1;i++){
            if(arr[i]>=arr[i+1])
                return false;
        }
        return true;
    }
    void InOrder(TreeNode *root){
        if(root == NULL)
            return;
        InOrder(root->left);
        arr.push_back(root->val);
        InOrder(root->right);
    }

private:
    vector<int> arr;
};

方案二:

可以通过递归的形式,但我们用从下往上递归还是从上往下递归呢?

先来看看从下往上递归,递归到深层次后,函数返回最大值和最小值,然后根据从左子树返回还是右子树返回,与根判断。并更新最大值最小值再返回到更上一层。

这个思路挺麻烦,实现起来也要有很多条件判断。那么从上往下呢?我们递归到深层次的时候,先让根与上层传递的上下界判断,如果不在这个界内,就立即返回FALSE。更深层次的时候,要用当前的根来更新相应的上界或者下届。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool check(TreeNode *node, int leftVal, int rightVal)
    {
        if (node == NULL)
            return true;
            
        return leftVal < node->val && node->val < rightVal && check(node->left, leftVal, node->val) &&
            check(node->right, node->val, rightVal);
    }
    
    bool isValidBST(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        return check(root, INT_MIN, INT_MAX);        
    }
};

点赞