LeetCode 98. 验证二叉搜索树 思考分析

66 阅读1分钟

题目

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

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

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
在这里插入图片描述

1、利用BST性质:中序遍历结果递增

由平衡二叉树的性质可知,若是用中序遍历方法,得到的结果会是递增的。
初次外,如果root的结点为空或者只有1个结点的时候,我们认为它也是一棵二叉搜索树。
以这样的思路写出的递归代码:

/**
 * 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:
    void traversal(TreeNode* cur , vector<int>& vec)
    {
        if(cur == NULL) return;
        traversal(cur->left,vec);
        vec.push_back(cur->val);
        traversal(cur->right,vec);
    }
    bool isValidBST(TreeNode* root) {
        vector<int> result;
        traversal(root,result);
        for(int i =1;i<result.size();i++)
        {
            if(result[i-1]>=result[i]) return false;
            //cout<<result[i]<<endl;
        }
        return true;
    }
};

在这里插入图片描述

2、不使用数组,进行优化

/**
 * 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:
    TreeNode* pre =NULL;        //用来记录前一个结点
    bool isValidBST(TreeNode* root) {
       if(root ==NULL) return true;
       //检查左子树是否为二叉搜索树
       bool left =isValidBST(root->left);
       //检查此中间结点与上一个中间结点是否是单调递增的关系
       if(pre != NULL && pre->val >= root->val) return false;
       pre = root;  //更新结点
       //检查右子树是否为二叉搜索树
       bool right = isValidBST(root->right);
       //左子树和右子树自身必须也是二叉搜索树
       return left && right;
    }
};

在这里插入图片描述

3、回顾迭代法求解

对迭代法中序遍历稍加改动:

/**
 * 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) {
       stack<TreeNode*> st;
       TreeNode* cur = root;
       TreeNode* pre = NULL;
       while(cur!=NULL || !st.empty())
       {
           if(cur !=NULL)
           {
               st.push(cur);
               cur = cur->left;
           }
           else
           {
               cur = st.top();
               st.pop();
               if(pre != NULL && cur->val <= pre->val) return false;
               pre = cur;
               cur = cur->right;
           }
       }
       return true;
    }
};

在这里插入图片描述