leetcode 98. 验证二叉搜索树(递归 栈)

链接:https://leetcode-cn.com/problems/validate-binary-search-tree/

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

用例

示例 1:

输入:root = [2,1,3]
输出:true
示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1

思路

方法1
中序遍历有序即为有效搜索二叉树
我写的非递归迭代版本 注意用例最小值为INT_MIN 所以设定最小值需要设为LONG_MIN(LONG LONG)

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack<TreeNode*>s;
        long long front=LONG_MIN;//  记录序列最小值
        while(root!=nullptr||!s.empty())
        {
            while(root!=nullptr)
            {
                s.push(root);
                root=root->left;
            }
            root=s.top();
            s.pop();
            if(root->val<=front)
            {
                return false;
            }else
            {
                front=root->val;
            }
            root=root->right;
        }
        return true;
    }
};

方法2
递归,递归条件给一个最大范围和最小范围 ,左侧递归更新最小范围 右侧递归更新最大范围

  class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return dfs(root,LONG_MIN,LONG_MAX);
    }
    bool dfs(TreeNode* root,long long lower,long long upper)
    {
        if(root==nullptr)
            return true;
        if(root->val<=lower||root->val>=upper)
            return false;
        return dfs(root->left,lower,root->val)&&dfs(root->right,root->val,upper);
    }
};
posted @ 2021-09-24 14:40  kitamu  阅读(39)  评论(0)    收藏  举报
Live2D