二叉搜索树中的搜索

力扣题目地址(opens new window)

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

例如,

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

什么是二叉搜索树?

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

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

如何遍历二叉搜索树?

上述二叉搜索树的性质决定了其递归遍历和迭代遍历和普通二叉树都不一样

递归

不同归不同,还是要遵守三步走的

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

在本题中,可以直接使用解题模板

class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) { }
};

即输入为根节点和待搜索的值

2、确定终止条件

因为是递归遍历嘛,如果根节点(即每次递归时的当前节点)为空或者找到目标值则递归结束

class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
//确定终止条件
if(root == NULL && root->val == val) return root;
}
};

3、确定单层处理逻辑

这里就与普通二叉树遍历有区别了

因为二叉搜索树的节点是有顺序的,我们可以有针对性的去搜索

如果当前节点的值大于目标值(root->val > val),那么就去搜索左子树(因为当前root的左子树中所有值都小于root的值,因此有可能有匹配val的节点)

如果当前节点的值小于目标值(root->val < val),那么就去搜索右子树

class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
//确定终止条件
if(root == NULL && root->val == val) return root; //当前节点的值大于目标值,去搜索左子树
if(root->val > val) res = searchBST(root->left, val);
if(root->val < val) res = searchBST(root->right, val);
return res;
}
};
迭代

由于二叉搜索树已经排好序,我们可以不使用辅助栈或者队列就可以写出迭代法

例如要搜索元素为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;//找到就返回root }
return NULL;//没找到
}
};

注意点

1、二叉搜索树,左小右大(左子树降序排,根节点最大;右子树升序,根节点最小)

2、迭代法依旧要使用while遍历,只是逻辑简单了

【LeetCode二叉树#13】遍历二叉搜索树的更多相关文章

  1. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  2. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

  3. LeetCode.938-范围内求二叉搜索树节点值之和(Range Sum of BST)

    这是悦乐书的第359次更新,第386篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第221题(顺位题号是938).给定二叉搜索树的根节点,返回节点值在[L,R]之间的所有 ...

  4. LeetCode动画 | 1038. 从二叉搜索树到更大和树

    今天分享一个LeetCode题,题号是1038,标题是:从二分搜索树到更大和数. 题目描述 给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等 ...

  5. Leetcode题目98.验证二叉搜索树(递归-中等)

    题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...

  6. 【LeetCode】98. 验证二叉搜索树

    98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...

  7. [LeetCode] Split BST 分割二叉搜索树

    Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...

  8. LeetCode 95——不同的二叉搜索树 II

    1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...

  9. LeetCode 96——不同的二叉搜索树

    1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...

  10. Leetcode 96. 不同的二叉搜索树

    题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n ...

随机推荐

  1. [转帖]优化超大 Nginx 配置导致的内存碎片

    https://blog.openresty.com.cn/cn/ngx-cycle-pool-frag/?src=org_news 章亦春发布于 Feb 14, 2023更新于 Mar 2, 202 ...

  2. [转帖]【k8s】5、资源管理命令-声明式

    文章目录 一. yaml和json介绍 1.yuml语言介绍 2.k8s支持的文件格式 3.yaml和json的主要区别 二.声明式对象管理 1.命令式对象配置 2.声明式对象配置 3.声明式对象管理 ...

  3. [转帖]技术派-汇编语言指令集(intel X86系列)

    针对汇编语言指令集(intel X86系列8086/80186/80286/80386/80486) AAA - Ascii Adjust for Addition        AAD - Asci ...

  4. true=='true'这个等式成立吗?

    在localStorage存入里面的数据是字符串,如果你存入了一个值是Boolean类型的, 那你你取出来就是一个字符串 'true' 或者 'false' 假设取出来的值是 'true' 在你进行i ...

  5. Unity Editor开发中查找属性的两种写法对比

    从2017开始,在editor脚本中查找属性是这样写的 var m_Script = serializedObject.FindProperty("m_Script"); Seri ...

  6. 设计模式学习-使用go实现中介者模式

    中介模式 定义 优点 缺点 适用范围 代码实现 参考 中介模式 定义 中介模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使个各对象不需要显示的相互引用,从而使其藕合松散,而且可 ...

  7. MySQL 之多表连查(精简笔记)

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...

  8. [MySQL] 给root用户设置权限

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'roo ...

  9. React Hooks 使用指南

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  10. Arduino-电位器调节led

    Arduino-电位器调节led 电位器相关: 电位器是具有三个引出端.阻值可按某种变化规律调节的电阻元件.电位器通常由电阻体和可移动的电刷组成.当电刷沿电阻体移动时,在输出端即获得与位移量成一定关系 ...