验证二叉搜索树的两种方法:递归与中序遍历
创作时间:
作者:
@小白创作中心
验证二叉搜索树的两种方法:递归与中序遍历
引用
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;
}
};
热门推荐
质量管理中的批量审查是如何进行的
吃了过期的药有什么危害
世界肝炎日丨贾继东教授:中国乙型肝炎防治的进展与挑战
评《即将到来的浪潮》:一场科技与人性的哲学对话
选择靠谱婴童食品,春季宝宝饮食的四个关键原则
认知重构技术2.1:苏格拉底式提问
明朝举人能当什么官?几十年都未必能当上个八品县丞
如何巧妙处理公司车辆费用?省税又合规!
外接固态硬盘能打游戏吗?一文告诉你答案
丁真:从藏族少年到文旅大使的四年
物理学专业大学排名(2025最新排行榜一览表)
做动量交易最值得读的5本经典著作,可以让你少走10年弯路!
一文搞懂Visa、Master、银联三大卡的区别
C1驾照几年更换一次?一文详解换证周期与办理流程
驾驶证过期了会有哪些法律后果?如何避免驾驶证过期带来的麻烦?
英国资产阶级革命:起因、经过与结果
腾讯IM Web发送图片的三种方法
孕晚期肚子疼痛怎么办?可能的原因及应对方法
卤鸡心鸡胗的做法
桌面端界面设计需要注意什么
历史上的分封制和郡县制有哪些区别?
哪些教师可以领取教龄津贴?
生活噪音扰民怎么办?处理方法、管理部门及标准时间全解析
红薯、紫薯、白薯的营养价值大比拼:为什么紫薯最贵?
白牡丹茶的冲泡时间与技巧
符号速率、调制方式、码率、传输速率
这些食物是“升糖高手”:管不住嘴,打再多胰岛素也没用
强如加内特1995年第五顺位被选中,前面的四人是谁?生涯成就如何
揭秘跨境电商:定义、模式与挑战全解析
琅琊榜第一集剧情详解:权谋与情感的交织