码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构刷题:第十三天


     

    目录

    一,二叉搜索树中的搜索

     1,递归

    复杂度分析

    2,迭代

    复杂度分析

    二,二叉搜索书中的插入操作

     1,模拟

    思路与算法

    复杂度分析

    一,二叉搜索树中的搜索

    700. 二叉搜索树中的搜索 - 力扣(LeetCode)https://leetcode.cn/problems/search-in-a-binary-search-tree/?plan=data-structures&plan_progress=ggfacv7

     1,递归

    二叉搜索树满足如下性质:

    左子树所有节点的元素值均小于根的元素值;
    右子树所有节点的元素值均大于根的元素值。
    据此可以得到如下算法:

    若 root 为空则返回空节点;
    若 val=root.val,则返回 \textit{root}root;
    若 val 若 val>root.val,递归右子树。

    1. class Solution {
    2. public:
    3. TreeNode *searchBST(TreeNode *root, int val) {
    4. if (root == nullptr) {
    5. return nullptr;
    6. }
    7. if (val == root->val) {
    8. return root;
    9. }
    10. return searchBST(val < root->val ? root->left : root->right, val);
    11. }
    12. };

    复杂度分析

    时间复杂度:O(N),其中 N 是二叉搜索树的节点数。最坏情况下二叉搜索树是一条链,且要找的元素比链末尾的元素值还要小(大),这种情况下我们需要递归 N 次。

    空间复杂度:O(N)。最坏情况下递归需要 O(N) 的栈空间。

    2,迭代

    我们将方法一的递归改成迭代写法:

    若 root 为空则跳出循环,并返回空节点;
    若 val=root.val,则返回root;
    若 val 若 val>root.val,将 root 置为 root.right。

    1. class Solution {
    2. public:
    3. TreeNode *searchBST(TreeNode *root, int val) {
    4. while (root) {
    5. if (val == root->val) {
    6. return root;
    7. }
    8. root = val < root->val ? root->left : root->right;
    9. }
    10. return nullptr;
    11. }
    12. };

    复杂度分析

    时间复杂度:O(N),其中 NN 是二叉搜索树的节点数。最坏情况下二叉搜索树是一条链,且要找的元素比链末尾的元素值还要小(大),这种情况下我们需要迭代 N 次。

    空间复杂度:O(1)。没有使用额外的空间。

    二,二叉搜索书中的插入操作

    701. 二叉搜索树中的插入操作 - 力扣(LeetCode)https://leetcode.cn/problems/insert-into-a-binary-search-tree/?plan=data-structures&plan_progress=ggfacv7

     1,模拟

    思路与算法

    首先回顾二叉搜索树的性质:对于任意节点 root 而言,左子树(如果存在)上所有节点的值均小于root.val,右子树(如果存在)上所有节点的值均大于 root.val,且它们都是二叉搜索树。

    因此,当将val 插入到以 root 为根的子树上时,根据val 与 root.val 的大小关系,就可以确定要将 val 插入到哪个子树中。

    如果该子树不为空,则问题转化成了将 \textit{val}val 插入到对应子树上。
    否则,在此处新建一个以 \textit{val}val 为值的节点,并链接到其父节点 root 上。

    1. class Solution {
    2. public:
    3. TreeNode* insertIntoBST(TreeNode* root, int val) {
    4. if (root == nullptr) {
    5. return new TreeNode(val);
    6. }
    7. TreeNode* pos = root;
    8. while (pos != nullptr) {
    9. if (val < pos->val) {
    10. if (pos->left == nullptr) {
    11. pos->left = new TreeNode(val);
    12. break;
    13. } else {
    14. pos = pos->left;
    15. }
    16. } else {
    17. if (pos->right == nullptr) {
    18. pos->right = new TreeNode(val);
    19. break;
    20. } else {
    21. pos = pos->right;
    22. }
    23. }
    24. }
    25. return root;
    26. }
    27. };

    复杂度分析

    时间复杂度:O(N),其中 N 为树中节点的数目。最坏情况下,我们需要将值插入到树的最深的叶子结点上,而叶子节点最深为 O(N)。

    空间复杂度:O(1)。我们只使用了常数大小的空间。

  • 相关阅读:
    高通平台开发系列讲解(应用篇)QCMAP应用框架介绍
    车内信息安全技术-安全技术栈-软件安全
    开服当GM的基本准则
    跨越技术鸿沟,革新存储产业:华瑞指数云重磅发布下一代软件定义存储产品
    图片转excel软件有哪些?这些软件你值得拥有
    JVM(十九) -- 字节码与类的加载(四) -- 再谈类的加载器
    RestTemplate响应结果转换
    分布式调度器xxl-job
    中国物流与采购杂志中国物流与采购杂志社中国物流与采购编辑部2022年第14期目录
    c# 多线程创建及线程同步
  • 原文地址:https://blog.csdn.net/m0_63309778/article/details/126746985
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号