leetcode98.验证二叉树

题目链接

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

个人题解

解法1

思路

根据二叉搜索树定义,左子树值均小于根,右子树值均大于根。由此便想到自下而上维护每个子树中最大最小值,确保树根左子树最大值小于根,右子树最小值大于根。

代码

class Solution {
    bool isValidBST0(TreeNode* root,int &maxv,int &minv) {
        if (root->left == nullptr && root->right == nullptr) {
            maxv = root->val;
            minv = root->val;
            return true;
        }
        int lmaxv,lminv,rmaxv,rminv;
        if(root->left && !isValidBST0(root->left,lmaxv,lminv))return false;
        if(root->right && !isValidBST0(root->right,rmaxv,rminv))return false;
        if(root->left && lmaxv >= root->val) return false;
        if(root->right && rminv <= root->val) return false;
        if(root->right)maxv = rmaxv;else maxv = root->val;
        if(root->left) minv = lminv;else minv = root->val;
        return true;
    }
public:
    bool isValidBST(TreeNode* root) {
        int maxv,minv;
        return isValidBST0(root,maxv,minv);
    }
};

解法2:

思路

解法1思路的改进。
左子树值均小于根,右子树值均大于根<=>根值是左子树上界,根值是右子树下界。
对树自上而下递归判断,当每个子树保证界限时,为二叉搜索树。因为值均为int整数,完整树的界限为(INT_MIN,INT_MAX),开区间。

代码

class Solution {
    bool isValidBST1(TreeNode* root,long long minv,long long maxv) {
        if (root == nullptr){
            return true;
        }
        if(root->val<=minv||root->val >=maxv)return false;
        return isValidBST1(root->left,minv,root->val) && isValidBST1(root->right,root->val,maxv);
    }
public:
    bool isValidBST(TreeNode* root) {
        return isValidBST1(root,-2147483649,2147483648);
    }
};
posted @   deepwzh  阅读(79)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示