找工作准备刷题Day8 二叉树 (卡尔41期训练营 7.22)

news2024/12/23 9:41:41

第一题:Leetcode235. 二叉搜索树的最近公共祖先

题目描述

 题解1——递归法

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr)
            return nullptr;

        if (root->val > p->val && root->val > q->val) {
            TreeNode* left = lowestCommonAncestor(root->left, p, q);
            if (left != nullptr)
                return left;
        }

        if (root->val < p->val && root->val < q->val) {
            TreeNode* right = lowestCommonAncestor(root->right, p, q);
            if (right != nullptr)
                return right;
        }
        // p和q一个在左子树,一个在右子树,返回root
        return root;
    }
};

要点

  1.  p和q都大于root->val,可以判定,其在root的右子树上;
  2.  p和q都小于root->val,可以判定,其在root的左子树上;
  3. p和q一个在左子树,一个在右子树,返回root。

题解2——迭代法

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while (root != nullptr) {
            if (root->val > p->val && root->val > q->val)
                root = root->left;
            else if (root->val < p->val && root->val < q->val)
                root = root->right;
            else
                return root;
        }

        return nullptr;
    }
};

原理同递归法。

第二题:Leetcode701. 二叉搜索树中的插入操作

题目描述

 要点

  1. Node.val值独一无二且在原始BST中不存在(其实这种限制脱离实际,在解题时应该基于更加复杂的环境多思考)
  2. 对于root和val值,如果root->val大于val,取root->left;如果root->val小于val,取root->right
  3. 需要时刻牢记返回值的意义。

题解

class Solution {
public:
    // 返回插入后树的根节点
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == nullptr) {
            // 到达插入位置
            root = new TreeNode(val);
            return root;
        }

        if (root->val > val)
            root->left = insertIntoBST(root->left, val);
        else
            root->right = insertIntoBST(root->right, val);

        return root;
    }
};

第三题:Leetcode450. 删除二叉搜索树中的节点

题目描述

解题思路

根据二叉搜索树的特性:根节点大于所有左子树节点,根节点小于所有右子树节点。

据此可以写出题解1。

对于普通二叉树,可以写出题解2。

题解1——利用二叉搜索树的特性

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr)
            return nullptr;

        if (root->val == key) {
            // root为叶子节点,delete root并返回nullptr
            if (root->left == nullptr && root->right == nullptr) {
                delete root;
                return nullptr;
            }
            // 左子树或者右子树其中一个为nullptr,另一个存在,返回存在的,并删除root
            if (root->left == nullptr || root->right == nullptr) {
                TreeNode* returnNode =
                    root->left == nullptr ? root->right : root->left;
                delete root;
                return returnNode;
            }

            // 左右子树都存在,将左子树 设置为 右子树最左边节点的左儿子
            if (root->left != nullptr && root->right != nullptr)
            {
                TreeNode* node = root->right;
                while(node->left)
                node = node->left;

                node->left = root->left;
                TreeNode* toDelete = root;
                root = root->right;
                delete toDelete;
                return root;
            }

        } else if (root->val > key)
            root->left = deleteNode(root->left, key);
        else
            root->right = deleteNode(root->right, key);
        return root;
    }
};

要点

  1. 当 root 为空时,找不到key,返回 nullptr;
  2. 当 root 取值大于key时,在左子树进行删除,并返回删除后的左子树;
  3. 当 root 取值小于key时,在右子树进行删除,并返回删除后的右子树;
  4. 当 root 取值为key时,存在以下几种情况:

【1】、左子树和右子树均为nullptr,delete root,返回nullptr即可;

【2】、左子树或者右子树其中一个为nullptr时,delete root,返回不为空的子树;

【3】、左右子树均不为空,为了保证删除root后仍为二叉搜索树,可以将左子树设置为右子树最左边节点的左子树(详见代码,下图从卡尔代码网复制过来的)。

题解2——不利用二叉搜索树,通用方法(交换)

解题思路

  1. 找到待删除的节点
  2. 将待删除的节点与其右子树最左侧节点交换,此时待删除节点换到了底层(不一定是叶子节点)
  3. 很绕很绕。。。

代码

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr)
            return root;

        if (root->val == key) {
            // 第二次操作,将已经被调换到最下方的待删除节点删除
            // 此处,当root的右子树为空,直接返回左子树即可。
            // 因此,其完成两部分内容:第二次删除 + 处理右子树为空情况。
            if(root->right == nullptr)
            {
                return root->left;
            }

            // 进入这里,则右子树不为空,左子树有可能为nullptr
            TreeNode* cur = root->right;
            while (cur->left)
                cur = cur->left;
            swap(cur->val, root->val);//第一次操作,把待删除的值换到右子树最左边节点
        }

        root->left = deleteNode(root->left, key);
        root->right = deleteNode(root->right, key);
        return root;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01、爬虫学习入门

爬虫&#xff1a;通过编写程序&#xff0c;来获取获取互联网上的资源 需求&#xff1a;用程序模拟浏览器&#xff0c;输入一个网址&#xff0c;从该网址获取到资源或内容 一、入门程序 #使用urlopen来进行爬取 from urllib.request import urlopen url "http://www.ba…

网络地址转换-NAT

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;的基本作用是实现内网 IP 地址与外网 IP 地址的转换…

求职学习day11背八股

本质上我和早睡早上起来玩一早上的游戏没有区别&#xff0c;甚至学习状态更差。得想个办法 12 点睡觉。 第三次 hr 面&#xff0c;为德科和华为的工作效率感到无语。 下周一两场面试。真是要死&#xff0c;这五天时间基本没学什么。八股、项目、手撕。。没一个有能力的感觉。…

代码随想录算法训练营第22天-leetcode-回溯算法part01:

#回溯算法理论基础 能解决的问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数的集合里有多少符合条件的子集排列问题&#xff1a;N个数按一定规则全排列&…

[023-2].第2节:SpringBoot中接收参数相关注解

我的后端学习大纲 SpringBoot学习大纲 1.1.基本介绍&#xff1a; SpringBoot接收客户端提交的数据、参数会使用的一些注解&#xff1a; 1.PathVarible2. RequestHeader3.RequestParam4.CookieValue5.RequestBody6.RequestAttribute 1.2.接收参数相关注解与应用实例&#xff1a;…

VirtualBox7.0.18报: IPv6 prefix is not unicast.

VirtualBox7.0.18 报: IPv6 prefix is not unicast. VirtualBox7.0.18 在设置 “NAT网络(Nat Network)” 的IPv6时, 报 IPv6 prefix x::x is not unicast. IPv6 prefix x::x is not unicast. 意思是 x::x 不是IPv6的单播地址 解决办法是: 改为 fcxx 或 fdxx 开头, 如 fc00 ,…

QT Creator下载安装详细教程(保姆级教程)

qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载&#xff1a;链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的&#xff0c;也可以选择4.7版本&#xff0c;问题不大。 根据电脑系统选择下载linux…

一天一个Harmony Next APP

历史的车轮已经来到太平洋东海岸。 此时如果还不会撸Harmony APP&#xff0c;注定要被碾压。 鸿蒙开发正在如火如荼的开展&#xff0c;抽空看一看吧。 一看就会&#xff0c;一做就废。 这里是一个看废的demo。 主要通过arkts实现鸿蒙关系数据库的封装&#xff0c;实现数据…

搭建自己的金融数据源和量化分析平台(一):系统架构设计

0x00 前言 由于某得的数据实在是太贵&#xff0c;某花顺免费版又不提供专业的数据分析工具&#xff0c;Tushare也开始收费&#xff0c;因此决定基于python和MySQL搭建一个自己的金融数据库。期望做到仅依靠交易所、巨潮资讯网等官方的公开数据实现&#xff0c;尽量不依靠某花顺…

Java中线程池的基本使用

参考这个课程&#xff0c;讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池&#xff08;让我们了解底层逻辑的&#xff09; 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

API 技术开发分享:连接电商平台数据获取的桥梁

在当今数字化的时代&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;技术成为了实现不同系统之间通信和数据交换的关键。它就像是一座无形的桥梁&#xff0c;使得各种应用能够相互协作&#xff0c;共享资源&#xff0c;…

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时&#xff0c;我们时常会遭遇DNS污染这一区域性攻击&#xff0c;几乎无人能幸免。受影响时&#xff1a;尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时&#xff0c;就像拨打朋友的电话号码一样…

第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…

docker笔记6-数据卷

docker笔记6-数据卷 一、初识dockerfile1.1 编写镜像1.2 构建镜像1.3 运行镜像 二、案例2.1 多个容器共享数据2.2 多个mysql数据共享 一、初识dockerfile 之前的内容中&#xff0c;我们都是通过pull的方式拉取别人写好的镜像&#xff0c;那么通过编写dockerfile&#xff0c;我…

Linux系统编程:传输层(补充)

1. 用UDP实现可靠传输 在前面介绍了UDP是一种不可靠的面向数据包的传输协议。那么如何实现UDP的可靠传输呢&#xff1f; 其实就是在应用层自己实现像TCP一样的可靠性机制&#xff1a;引入序列号、引入确认应答、超时重传、流量控制、拥塞控制等机制。 2. listen系统接口 在…

四向穿梭车价格战进入下半场,杀入单台10万区间~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 近年来&#xff0c;仓储自动化设备市场蓬勃发展&#xff0c;其中四向穿梭车作为新兴明星产品&#xff0c;正在引领一场仓储革命。 数据显示&#xff0c;2023年中国托盘四向穿梭车销量…

初学Mybatis之 Lombok 篇

idea 安装 Lombok 插件&#xff1a; File->Settings->Plugins->搜索 lombok 下载 在项目中导入 lombok 的 jar 包&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.…

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…

机器学习课程学习周报五

机器学习课程学习周报五 文章目录 机器学习课程学习周报五摘要Abstract一、机器学习部分1.1 向量序列作为模型输入1.1.1 文字的向量表达1.1.2 语音的向量表达 1.2 自注意力机制原理1.2.1 自注意力机制理论1.2.2 矩阵运算自注意力机制 1.3 多头自注意力1.4 位置编码1.5 截断自注…

Nginx中WebSocket配置说明

查看 laravel 的 swool扩展文档时遇到不懂的&#xff0c;问了文心一言 https://gitee.com/resourcesplus/laravel-s/#%E5%90%AF%E7%94%A8websocket%E6%9C%8D%E5%8A%A1%E5%99%A8 nginx语法中 upstream 和 proxy_pass 用法