验证二叉搜索树的两种方法:递归与中序遍历
创作时间:
作者:
@小白创作中心
验证二叉搜索树的两种方法:递归与中序遍历
引用
1
来源
1.
https://www.cnblogs.com/yueshengd/p/18628446
二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树中的所有节点值,且小于其右子树中的所有节点值。验证一个二叉树是否满足BST的性质,是算法和数据结构学习中的一个重要问题。本文将介绍两种常见的验证方法:递归和中序遍历。
给你一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树。
有效二叉搜索树定义如下:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
方法一:递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 辅助函数:递归检查每个节点是否满足二叉搜索树的性质
// 参数:
// root: 当前节点
// lower: 当前节点值允许的最小值(开区间)
// upper: 当前节点值允许的最大值(开区间)
bool isValidBST(TreeNode* root, long long lower, long long upper) {
// 如果当前节点为空,则认为是有效的二叉搜索树
if (root == nullptr) return true;
// 检查当前节点的值是否在合法范围内
// 二叉搜索树中任意节点的值应严格大于左子树所有节点的值,并严格小于右子树所有节点的值
if (root->val <= lower || root->val >= upper) return false;
// 递归检查左右子树
// 左子树的所有节点值必须小于当前节点的值
// 右子树的所有节点值必须大于当前节点的值
return isValidBST(root->left, lower, root->val) &&
isValidBST(root->right, root->val, upper);
}
// 主函数:判断给定的二叉树是否为有效的二叉搜索树
// 参数:
// root: 树的根节点
bool isValidBST(TreeNode* root) {
// 调用辅助函数,初始时整个树的节点值范围为(long最小值, long最大值)
return isValidBST(root, LONG_MIN, LONG_MAX);
}
};
方法二:中序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
//中序遍历需要的栈
stack<TreeNode*> st;
TreeNode* node = root;
//记录上一次的值
long long last = LONG_MIN;
while(node!=nullptr||!st.empty()){
while(node!=nullptr){//一直向左子树方向
st.push(node);
node = node->left;
}
//已经到最左边了
TreeNode* temp = st.top();
//确保为升序序列,否则直接返回false
if((long long)temp->val<=last) return false;
//更新last的值
last = temp->val;
//再看右子树
node = temp->right;
//弹出已访问节点
st.pop();
}
return true;
}
};
热门推荐
《跑男》新一季录制时间公布,八大常驻阵容确定
春节护嗓指南!别让美食“伤”了咽喉!
Nature深度:大模型如何“赋能”机器人?机器人又如何“训练”大模型?
光面、雾面、特殊面,买OLED显示器你选谁?
什么是古法金手镯?古法金手镯的工艺和特点
谁的IQ最高?揭开历史上智力天才的面纱
强势逆袭还是另有隐忧?2024年度全国高校名单,河南领跑引发热议
初中英语语法之名词:所有格形式的构成
脑子聪明十大特征
如何利用知识图谱技术进行大模型问答能力提升?
中俄跨境物流全攻略:TIR运输、铁路班列与海运如何选择?
T4激素调控能量代谢与健康状态的重要性与机制探究
为什么头发一直掉?解析6个脱发原因及改善方法,从根源强化发根健康
二战风云中的科技突破:雷达技术的力量
射雕三部曲中还有哪些人具备五绝的实力
2025年中国决策类人工智能行业现状分析与政策展望
女朋友发烧了怎么哄?这五个办法帮你“搞定”
微信群的群管理技巧:有效构建与管理社群的新方法
《仙逆》动画角色成长探秘:王林从少年到"老年"的蜕变之路
纳兰性德《秣陵怀古》:跨越时空的兴亡感慨
如何确定运行内存数据库
黄瓜虽好,但这些食物却不宜同食,你可知道?
《三国演义》作为文学作品,与真实历史有几分相似?
如何判断网卡是否坏了(最直接方法揭秘)
换省份工作社保
遏制妖股唯有价值投资
新希望资金安全性需重新审视?定增补流与财务公司"输血"并存
查理芒格的投资哲学:六句箴言,让你在投资路上少走弯路
十大上火食物排行榜:大蒜上榜,第六适合冬季吃
喜用神为水适合戴什么 喜用神为水该怎么补运