二叉搜索树详解及LeetCode实战:搜索与验证
创作时间:
作者:
@小白创作中心
二叉搜索树详解及LeetCode实战:搜索与验证
引用
CSDN
1.
https://m.blog.csdn.net/weixin_63948917/article/details/137078654
二叉搜索树
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。
如:
LeetCode700.二叉搜索树中的搜索
递归法
就是递归遍历二叉搜索树
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
// 空,不存在
if(!root) return NULL;
// 找到
if(root->val == val) return root;
// 递归去找
if(val < root->val)
return searchBST(root->left, val);
if(val > root->val)
return searchBST(root->right, val);
return NULL;
}
};
迭代法
一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。
对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。
代码
OMG…居然这么短这么简单…
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
// 法2 迭代
while(root){
if(val < root->val) root = root->left;
else if(val > root->val) root = root->right;
else return root;
}
return root;
}
};
LeetCode98.验证二叉搜索树
第一想法
递归地验证。
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root == NULL) return true;
// 判断左右节点是否符合
bool left = true;
bool right = true;
//左子树
if(root->left){
//左节点是否符合
if(root->left->val >= root->val)
left = false;
else
//左节点合格,左子树是否合格
left = isValidBST(root->left);
}
//右子树
if(root->right){
if(root->right->val <= root->val)
right = false;
else
right = isValidBST(root->right);
}
//左右同时合格才行
return left && right;
}
};
犯错的情况:
6比10小,但是却在10的右子树上。
解题思路(递归法)
代码随想录 (programmercarl.com)
中序遍历下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
代码
中序遍历,存入数组。最后判断数组是否是递增的。
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val); // 将二叉搜索树转换为有序数组
traversal(root->right);
}
public:
bool isValidBST(TreeNode* root) {
vec.clear(); // 不加这句在leetcode上也可以过,但最好加上
traversal(root);
for (int i = 1; i < vec.size(); i++) {
// 注意要小于等于,搜索树里不能有相同元素
if (vec[i] <= vec[i - 1]) return false;
}
return true;
}
};
还有另外的写法以及迭代法,但是短时间内没看懂,先掌握这一种,下次再来看(代码随想录的网站上)
热门推荐
揭秘萝卜章骗局:如何辨别印章真伪?
爆款散文的四大特质:以余华等名家作品为例
1990年亚运会纪念币收藏热再起:历史见证与收藏价值
无痛无恢复期,皮秒激光引领面部美容新趋势
1990年生肖马金币:收藏界的“黑马”
面部美容手术后恢复指南:从术后护理到注意事项
日月潭一日游攻略:必打卡景点大揭秘
冬季旅游收纳指南:让20寸行李箱发挥最大效能
六横公路大桥一期沥青路面完工,长三角一体化交通再添新通道
六横公路大桥一期工程取得重大进展,2025年将实现宁波至舟山10分钟通达
宁波福泉山:东钱湖畔赏四季美景,探千年古刹品美食
新型聚谷氨酸钙肥:钙吸收率更高,土壤更健康
英超独立之路:欧洲足球联赛“管办分离”样本
柔佛足球俱乐部:东南亚唯一亚洲足协杯冠军得主
EDTA螯合钙在冬季土壤改良中的应用优势与方法
反物质研究新突破:从粒子加速器到宇宙探索
建筑如何影响你的大脑
洛芙抗真菌药膏:科学应对真菌感染,还你健康肌肤
“喵静情”让公猫不再“炸毛”
1271年:忽必烈建立元朝背后的秘密
联苯苄唑乳膏:皮肤科抗真菌神器
忽必烈统一中国:从草原到中原的传奇之路
起效快副作用少,左乙拉西坦成癫痫治疗新星
左乙拉西坦用药指南:从剂量调整到副作用管理
周公解梦教你应对梦见去世亲人的情感
从哈尔滨到西藏:中国十大赏雪胜地全攻略
从“免贵”看中国人的谦逊之道
第四套人民币银行还能兑换吗
成语故事精选-探索背后的智慧与趣味
高僧5岁时写的诗,仅20字无一生僻,却道出不少大人都不懂的道理