本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

700.二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

思路

之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。

在关于二叉树,你该了解这些!中,我们已经讲过了二叉搜索树。

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。

本题,其实就是在二叉搜索树中搜索一个节点。那么我们来看看应该如何遍历。

递归法

  1. 确定递归函数的参数和返回值

递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。

代码如下:

TreeNode* searchBST(TreeNode* root, int val)
  1. 确定终止条件

如果root为空,或者找到这个数值了,就返回root节点。

if (root == NULL || root->val == val) return root;
  1. 确定单层递归的逻辑

看看二叉搜索树的单层递归逻辑有何不同。

因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。

如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。

代码如下:

if (root->val > val) return searchBST(root->left, val); // 注意这里加了return
if (root->val < val) return searchBST(root->right, val);
return NULL;

这里可能会疑惑,在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢。

我们在二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。

因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。

整体代码如下:

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if (root == NULL || root->val == val) return root;if (root->val > val) return searchBST(root->left, val);if (root->val < val) return searchBST(root->right, val);return NULL;}
};

迭代法

一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。

对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。

对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。

对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。

例如要搜索元素为3的节点,我们不需要搜索其他节点,也不需要做回溯,查找的路径已经规划好了。

中间节点如果大于3就向左走,如果小于3就向右走,如图:

所以迭代法代码如下:

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {while (root != NULL) {if (root->val > val) root = root->left;else if (root->val < val) root = root->right;else return root;}return NULL;}
};

第一次看到了如此简单的迭代法,是不是感动的痛哭流涕,哭一会~

总结

本篇我们介绍了二叉搜索树的遍历方式,因为二叉搜索树的有序性,遍历的时候要比普通二叉树简单很多。

但是一些同学很容易忽略二叉搜索树的特性,所以写出遍历的代码就未必真的简单了。

所以针对二叉搜索树的题目,一样要利用其特性。

文中我依然给出递归和迭代两种方式,可以看出写法都非常简单,就是利用了二叉搜索树有序的特点。

就酱,如果学到了,就转发给身边需要的同学吧!

我是程序员Carl,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「简单自我介绍」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。

以下资料希望对你有帮助:

  • 学习资料以及我的开源项目
  • 我的B站视频:算法和编程语言的讲解
  • leetcode刷题攻略
  • 程序员应该如何写简历(附简历模板)
  • 一线互联网公司技术面试的流程以及注意事项
  • C++面试&C++学习指南知识点整理

如果感觉题解对你有帮助,不要吝啬给一个

「leetcode」700. 二叉搜索树中的搜索:【递归法】【迭代法】详解相关推荐

  1. LeetCode Algorithm 700. 二叉搜索树中的搜索

    700. 二叉搜索树中的搜索 Ideas 通过二叉搜索树的定义,可以容易的写出递归. Code C++ class Solution {public:TreeNode* searchBST(TreeN ...

  2. leetcode系列-700.二叉搜索树中的搜索

    题目描述:给定二叉搜索树(BST)的根节点 root 和一个整数值 val. 你需要在 BST 中找到节点值等于 val 的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 null . 示例 ...

  3. 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

    算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums . 最大二叉 ...

  4. [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树

    [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树 1.题目 题目链接 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree) ...

  5. Leetcode 538. 把二叉搜索树转换为累加树 C++

    Leetcode 538. 把二叉搜索树转换为累加树 题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加 ...

  6. Leetcode 98:验证二叉搜索树

    Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...

  7. DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)

    作者:王昆仑 (天津大学) Stata连享会 计量专题  || 公众号合集 2020寒假Stata现场班 (北京, 1月8-17日,连玉君-江艇主讲) 「+助教招聘」 2020寒假Stata现场班 文 ...

  8. 倍分法DID详解 (二):多时点 DID (渐进DID)

      作者:王昆仑 (天津大学)   Stata连享会 计量专题 || 公众号合集   导入 在 「连享会 - 倍分法系列推文」-- 「倍分法DID详解 (一):传统 DID」 文中,我们详细介绍了 D ...

  9. SAP UI5 应用开发教程之一百零二 - SAP UI5 应用的打印(Print)功能实现详解试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 作者简介 Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今.Jerry 是 SAP 社区导师,S ...

  10. python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...

最新文章

  1. spring boot整合spring security笔记
  2. python selenium error “Geckodriver executable needs to be in PATH”
  3. 30多岁程序员老W,无奈选择转行!问题出在哪?
  4. python找不到tushare_python tushare
  5. php使用redis生成自增序列号码,Redis使用Eval多个键值自增的操作实例
  6. Git之深入解析本地仓库的基本操作·仓库的获取更新和提交历史的查看撤销以及标签别名的使用
  7. 从Word,Excel中提取Flash
  8. 如果把电商的经营分为选品、供应链、视觉、营销四个环节
  9. 网络摄像头转usb接口_同时读取多个摄像头数据(包括海康网络摄像头和USB摄像头)...
  10. Javascript多线程引擎(五)
  11. ms17-010(永恒之蓝)搭建、攻击、打补丁
  12. 实对称矩阵性质的数学证明
  13. 用计算机拜年祝福语,适合拜年发的朋友圈祝福语
  14. 漫谈大数据 - 实时数据仓库以及大厂实际应用
  15. eval()与train()(结合源码理解)
  16. 机器学习服务助应用内文本语种在线和离线检测
  17. 全球与中国汽车空气悬架系统市场现状及未来发展趋势
  18. Python中英文翻译工具
  19. mathtype 章节号 Equation Chapter 1 Section 1 的去除
  20. euler和鸿蒙,euleros 鸿蒙

热门文章

  1. Spring系列:学习Spring的资源和讨论
  2. 【转载】【凯子哥带你学Framework】Activity界面显示全解析(下)
  3. Objective-C语法之集合对象的那些事儿(九)
  4. 绪论、关系数据库知识点总结
  5. echarts使用记录(二)legend翻页,事件,数据集,设置y轴最大/小值,让series图形从右侧出往左移动...
  6. pandas(python2) 读取中文数据,处理中文列名
  7. 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)
  8. Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象
  9. js中的相等与不等运算
  10. 判断滚动条到底部的JS代码