Leetcode刷题笔记题解(C++):98. 验证二叉搜索树

Leetcode刷题笔记题解(C++):98. 验证二叉搜索树_第1张图片

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。

 

思路一:根据它的性质进行递归判断:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode* root){
        if(root == NULL)  return true;
        return isBST(root,INT_MIN,INT_MAX);
    }
    bool isBST(TreeNode* root,long min, long max ) {
        if(!root) return true;
        if(root->val < min || root->val > max) return false;
        return isBST(root->left,min,root->val - 1l) && isBST(root->right,root->val + 1l,max);
    }
};

思路二:二叉搜索树的中序遍历是单调递增的

先求出 中序遍历,再进行遍历判断。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
     bool isValidBST1(TreeNode* root) {
         if(root==NULL) return true;
         vector temp;
         stack s;
         while(root||!s.empty()){
             if(root){
                 s.push(root);
                 root=root->left;
             }
             else{
                 root=s.top();
                 s.pop();
                 temp.push_back(root->val);
                 root=root->right;
             }
         }
         for(int i=1;i

 

 

你可能感兴趣的:(Leetcode算法题解)