力扣-98-验证二叉搜索树

题目:传送门

题目分析:二叉搜素树有一个很重要的性质:

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

若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值。

那么,很容易得到,对二叉搜索树进行中序遍历,得到的序列应该是升序的。

这样的话,我们在中序遍历的时候检查当前节点的值是否大于前一次中序遍历的节点的值即可,中序遍历用二叉树维护。

在使用栈的中序遍历中加入,判断当前节点与上一次中序遍历的节点值即可。

/**
 * 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) {
        long long pre = (long long)INT_MIN - 1;
        stack<TreeNode* > Stack;
        TreeNode* curr = root;
        while(curr != NULL || !Stack.empty()){
            while(curr != NULL) {//找左子树,并压入堆栈
                Stack.push(curr);
                curr = curr->left; 
            }
            curr = Stack.top();
            Stack.pop();
            if(curr->val <= pre) return false;
            pre = curr->val;
            curr = curr->right;
        }
        return true;
    }
};

 

方法二:维护每个节点值$lower$和$upper$,然后中序遍历二叉搜索树,并判断是否满足即可。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
typedef long long ll;
class Solution {
public:
    bool dfs(TreeNode* root, ll upper, ll lower){
        if(root == NULL){
            return true;
        }
        if(root->val >= upper || root->val <= lower) return false;            
        if(!dfs(root->right, upper, root->val) || !dfs(root->left, root->val, lower)) return false;
        return true;
    }
    
    bool isValidBST(TreeNode* root) {
        return dfs(root, LONG_MAX, LONG_MIN);    
    }
};

 

posted @ 2020-07-26 16:12  Peterxiazhen  阅读(249)  评论(0编辑  收藏  举报