【LeetCode二叉树#13】遍历二叉搜索树
二叉搜索树中的搜索
给定二叉搜索树(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】遍历二叉搜索树的更多相关文章
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【python】Leetcode每日一题-二叉搜索树节点最小距离
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
- LeetCode.938-范围内求二叉搜索树节点值之和(Range Sum of BST)
这是悦乐书的第359次更新,第386篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第221题(顺位题号是938).给定二叉搜索树的根节点,返回节点值在[L,R]之间的所有 ...
- LeetCode动画 | 1038. 从二叉搜索树到更大和树
今天分享一个LeetCode题,题号是1038,标题是:从二分搜索树到更大和数. 题目描述 给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等 ...
- Leetcode题目98.验证二叉搜索树(递归-中等)
题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...
- 【LeetCode】98. 验证二叉搜索树
98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...
- [LeetCode] Split BST 分割二叉搜索树
Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...
- LeetCode 95——不同的二叉搜索树 II
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
- LeetCode 96——不同的二叉搜索树
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
- Leetcode 96. 不同的二叉搜索树
题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n ...
随机推荐
- 部分操作系统不支持 zip unzip 大于4G的文件.
https://www.ibm.com/mysupport/s/question/0D50z00006PD9XXCA1/bad-zipfile-offset-local-header-sig-erro ...
- KD-Tree 小记🐤
KD-Tree,是用来维护一个空间(其实一般是平面)中的信息的数据结构. 以下就 2D-Tree 进行讨论.(盲猜并不会考 3D 及以上) 思想:将一个大矩形以一种方式划分成若干个小矩形,然后询问时只 ...
- expres实现登录与修改密码
登录模块 如果登录的时候,昵称在数据库中查询的是不唯一值.需要提示用户登录失败. 即使用户密码输入正确. 然后将该消息通知相关人员,立即进行排查问题. var express = require('e ...
- Windows 堆管理机制 [3] Windows XP SP2 – Windows 2003 版本
3. Windows XP SP2 – Windows 2003 3.1 环境准备 环境 环境准备 虚拟机 32位Windows XP SP2 \32位Windows XP SP3 调试器 OllyD ...
- 微信小程序-组件生命周期方法
官方文档:https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html 正如官方显示组件的生命周期中常用的 ...
- BigDecimal详解和精度问题
JavaGuide :「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识. BigDecimal 是大厂 Java 面试常问的一个知识点. <阿里巴巴 Java 开发 ...
- 【JVM】JDK7后intern方法总结
JDK6及之前字符串常量池是放在永久代的,这里不讨论,JDK7之后将字符串常量池迁移到了JVM的堆中,注意删除永久代更换为元空间是JDK8哈. 测试代码1如下: @Test public void t ...
- NLP领域任务如何选择合适预训练模型以及选择合适的方案【规范建议】【ERNIE模型首选】
1.常见NLP任务 信息抽取:从给定文本中抽取重要的信息,比如时间.地点.人物.事件.原因.结果.数字.日期.货币.专有名词等等.通俗说来,就是要了解谁在什么时候.什么原因.对谁.做了什么事.有什么结 ...
- centOS系统 迁移docker镜像及数据文件到指定目录
话说我今天正在快乐的敲代码,突然看到IDE报警磁盘空间不足了,du -h 查看了一下磁盘占用情况,发现是自己的docker镜像全部放/var/lib/docker目录下 这个系统磁盘给根目录只分配了5 ...
- P3730 曼哈顿交易 题解
题目链接:曼哈顿交易 比较容易想的题,观察下首先不带修改,考虑维护的东西:次数作为权值,这玩意很显然很难在线维护,考虑下离线算法.看到这种和次数有关的权值,典型的单点加入和删除是非常好找到变化的,那么 ...