LeetCode700. 二叉搜索树中的搜索
1.力扣151. 反转字符串中的单词2.LeetCode515.在每个树行中找最大值3.LeetCode104.二叉树的最大深度4.LeetCode111.二叉树的最小深度5.LeetCode136. 只出现一次的数字6.LeetCode260. 只出现一次的数字 III7.LeetCode151. 反转字符串中的单词8.LeetCode225. 用队列实现栈9.LeetCode102.二叉树的层序遍历10.LeetCode107.二叉树的层序遍历II11.LeetCode199.二叉树的右视图12.LeetCode637.二叉树的层平均值13.LeetCode226. 翻转二叉树14.LeetCode455.分发饼干15.LeetCode860. 柠檬水找零16.LeetCode122. 买卖股票的最佳时机 II17.LeetCode1005. K 次取反后最大化的数组和18.LeetCode53. 最大子数组和19.LeetCode513. 找树左下角的值20.LeetCode135. 分发糖果21.LeetCode222.完全二叉树的节点个数
22.LeetCode700. 二叉搜索树中的搜索
23.LeetCode98. 验证二叉搜索树24.LeetCode530. 二叉搜索树的最小绝对差25.LeetCode654. 最大二叉树26.LeetCode617. 合并二叉树27.回溯算法介绍以及模板28.LeetCode216.组合总和lll29.LeetCode39. 组合总和30.LeetCode40.组合总和II31.动态规划方法论32.线性dp:编辑距离33.线性dp:大盗阿福(打家劫舍)34.LeetCode300.最长递增子序列35.线性dp:LeetCode674. 最长连续递增序列36.线性dp:LeetCode516 .最长回文子序列37.线性dp:LeetCode122.买卖股票的最佳时机ll题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
题目叙述:
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
树中节点的数目在范围 [1, 10^4] 内
-10^5 <= Node.val <= 10^5
思路:
我们首先要知道二叉搜索树是一颗什么树:
二叉搜索树是一个有序树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉搜索树
在了解完二叉搜索树以后,我们就可以开始分析了。
这题是查找一个二叉树中的某一个节点的值等于val,本质上就是在二叉树中查找一个节点,它的值为val(不一定存在),那么我们是肯定要遍历这个二叉树的所有节点,又因为这个二叉树不是
普通的二叉树,是二叉搜索树,是有顺序的二叉树,因此我们直接可以根据这个规律来进行搜索,这题我们可以使用递归法和迭代法两种规则
递归法
递归法我们在前面的文章里面也介绍过了,要注意三步:
- 递归函数的参数和返回值:本题我们是查找一个节点的值为val,那么返回值就是TreeNode*,树的结点类型,并且我们要传入一个树的根结点,这就是函数的参数和返回值
- 递归结束的条件:当我们的递归搜索到了空结点或者搜索到的这个结点的值就等于val的时候,我们是不是就应该返回了。所以递归结束的条件是
if(root==NULL||root->val==val) return root;
- 单层递归的逻辑:这题我们单层递归的逻辑很简单,因为二叉搜索树是一颗有序的树,那么我们就直接比对当前结点的值与val的大小,如果
root->val<val
那么我们应该到二叉树的右子树
去搜索;否则就去二叉树的左子树进行搜索。
得出代码:
//递归法在二叉搜索树中搜索值 class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { if (root == NULL || root->val == val) return root; TreeNode* result = NULL; //如果当前结点的值大于val,就搜索左边的树 if (root->val > val) result = searchBST(root->left, val); //否则,搜索右边的树 if (root->val < val) result = searchBST(root->right, val); return result; } };
迭代法
迭代法也是可以的,和递归的逻辑差不多,当前结点的值大于val,就到左子树去搜索,否则去右子树搜索
迭代法代码:
class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { while(root!=NULL){ if(root->val==val) return root; else if(root->val>val) root=root->left; else if(root->val<val) root=root->right; } //没搜到就返回空 return NULL; } };
合集:
LeetCode
分类:
LeetCode / 二叉树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了