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);
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架