DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录

LeetCode: 669. 修剪二叉搜索树

基本思路

C++代码

LeetCode: 108.将有序数组转换为二叉搜索树

基本思路

C++代码

LeetCode: 538.把二叉搜索树转换为累加树

基本思路

C++代码


LeetCode: 669. 修剪二叉搜索树

力扣代码链接

文字讲解:LeetCode: 669. 修剪二叉搜索树

视频讲解:你修剪的方式不对,我来给你纠正一下!

基本思路

        这个题目比较简单,但是一定要注意遇到节点在目标区间以外,不能直接返回null,而是应该继续向下判定,因为对于一个搜索二叉树来讲,在遍历整个二叉树的节点的过程中,如果某个节点的值小于区间的最小值,对于该节点的左子树中的所有节点一定都小于目标区间的最小值,但是右子树中却可能存在符合目标区间的值,因此还需要进一步进行判定。

  • 确定递归函数的参数以及返回值

        参数:需要传入当前遍历的节点,还需要传入目标取件的边界值low和high。

        返回值:返回需要删除的节点。

TreeNode* trimBST(TreeNode* root, int low, int high)
  • 确定终止条件

        修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。

if (root == nullptr ) return nullptr;
  • 确定单层递归的逻辑

        如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。

if (root->val < low) {
    TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
    return right;
}

        如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。

if (root->val > high) {
    TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
    return left;
}

        接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
return root;

C++代码

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr ) return nullptr;
        if (root->val < low) {
            TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
            return right;
        }
        if (root->val > high) {
            TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
            return left;
        }
        root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
        root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
        return root;
    }
};

LeetCode: 108.将有序数组转换为二叉搜索树

力扣代码链接

文字讲解:LeetCode: 108.将有序数组转换为二叉搜索树

视频讲解:构造平衡二叉搜索树!

基本思路

        构建平衡二叉树是为因为给定任意一个有序数组,都可以直接构建一颗线性结构的二叉树。而构建二叉树我们首先就应该想到根据数组构建二叉树,本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间分割点就是数组中间位置的节点。

  • 确定递归函数返回值及其参数

        参数:需要传入一个有序数组,并且需要传入数组的左右下标(根据数组的左右下标来构建二叉树)

        返回值:返回构建二叉树的根节点。

// 左闭右闭区间[left, right]
TreeNode* traversal(vector<int>& nums, int left, int right)

        这里注意,我这里定义的是左闭右闭区间,在不断分割的过程中,也会坚持左闭右闭的区间,这又涉及到我们讲过的循环不变量原则

  • 确定递归终止条件

        这里定义的是左闭右闭的区间,所以当区间left>right当时候,就是空结点了。

if (left > right) return nullptr;
  • 确定单层递归的逻辑

        根据数组区间的左右下标来构建二叉树,其中二叉树的根节点为mid = left+(right-left)/2,此时中间节点为:

TreeNode* root = new TreeNode(nums[mid]);

        接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点,最后返回root节点。

int mid = left + ((right - left) / 2);//为偶数时向下取整
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;

C++代码

class Solution {
private:
    TreeNode* traversal(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int mid = left + ((right - left) / 2);
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums, left, mid - 1);
        root->right = traversal(nums, mid + 1, right);
        return root;
    }
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root = traversal(nums, 0, nums.size() - 1);
        return root;
    }
};

        注意:在调用traversal的时候传入的left和right为什么是0和nums.size() - 1,因为定义的区间为左闭右闭

LeetCode: 538.把二叉搜索树转换为累加树

力扣代码链接

文字讲解:LeetCode: 538.把二叉搜索树转换为累加树

视频讲解:普大喜奔!二叉树章节已全部更完啦!

基本思路

        其实这就是一棵树,大家可能看起来有点别扭,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。

        为什么变成数组就是感觉简单了呢?

        因为数组大家都知道怎么遍历啊,从后向前,挨个累加就完事了,这换成了二叉搜索树,看起来就别扭了一些是不是。那么知道如何遍历这个二叉树,也就迎刃而解了,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。

  • 递归函数参数以及返回值

        首先需要定义一个全局变量pre,用来记录前一个节点的值。

        参数:传入当前节点

        返回值:只需要对遍历的节点的值进行操作,不需要什么返回值。

int pre = 0; // 记录前一个节点的数值
void traversal(TreeNode* cur)
  • 确定终止条件

        遇空节点就终止。

if (cur == NULL) return;
  • 确定单层递归的逻辑

        注意要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。

traversal(cur->right);  // 右
cur->val += pre;        // 中
pre = cur->val;
traversal(cur->left);   // 左

C++代码

class Solution {
private:
    int pre = 0; // 记录前一个节点的数值
    void traversal(TreeNode* cur) { // 右中左遍历
        if (cur == NULL) return;
        traversal(cur->right);
        cur->val += pre;
        pre = cur->val;
        traversal(cur->left);
    }
public:
    TreeNode* convertBST(TreeNode* root) {
        pre = 0;
        traversal(root);
        return root;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon edges_sub_pix

1、算子帮助文档 edges_sub_pix 使用递归实现的滤波器&#xff08;根据Deriche、Lanser和Shen的方法&#xff09;或Canny提出的常规实现的“高斯导数”滤波器&#xff08;使用滤波器掩模&#xff09;来检测阶梯边缘。因此&#xff0c;以下边缘算子可用于滤波器&#xff1a; der…

SpringBoot配置Rabbit中的MessageConverter对象

SpringAMQP默认使用SimpleMessageConverter组件对消息内容进行转换 SimpleMessageConverter&#xff1a; only supports String, byte[] and Serializable payloads仅仅支持String、Byte[]和Serializable对象Jackson2JsonMessageConverter&#xff1a;was expecting (JSON Str…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30目录1. Step Guided Reasoning: Improving Mathematical Reasoning using Guidance Generation and Step Reasoning摘要研究背…

LabVIEW在Windows和Linux开发的差异

LabVIEW广泛应用于工程和科研领域的自动化和测量控制系统开发&#xff0c;其在Windows和Linux平台上的开发环境有所不同。这些差异主要体现在操作系统兼容性、硬件支持、软件库和驱动程序、实时系统开发以及部署选择上。以下从各个方面详细对比分析LabVIEW在Windows与Linux系统…

大模型日报|7 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.加州大学团队推出“罕见病”大模型 Zebra-Llama 罕见病为医疗保健带来了独特的挑战&#xff0c;通常会出现诊断延迟和信息分散的情况。这些疾病的可靠知识稀缺&#xff0c;给大语言模型&#xff08;LLM&#xff09…

Docker篇(基础命令)

目录 一、启动与停止 二、镜像相关的命令 1. 查看镜像 2. 搜索镜像 3. 拉取镜像 4. 删除镜像 三、容器创建与启动容器 1. 查看容器 2. 创建容器 交互式方式创建容器 守护式方式创建容器 3. 容器启动与停止 四、容器操作命令 1. 文件拷贝 2. 目录&#xff08;文件…

网络安全认证的证书有哪些?

在网络安全领域&#xff0c;专业认证不仅是个人技术能力的象征&#xff0c;也是职业发展的重要推动力。随着网络安全威胁的日益严峻&#xff0c;对网络安全专业人才的需求也在不断增长。本文将介绍一些网络安全认证的证书&#xff0c;帮助有志于从事网络安全行业的人士了解并选…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记&#xff1a;Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

tomato靶机

下载tomato地址:https://vulnhub.com/entry/tomato-1,557/ 直接拖进虚拟机中 tomato靶机和kali虚拟机必须在同一网段所以使用nat模式 扫描主机 arp-scan -I eth0 -l 发现新主机ip 192.168.142.147 nmap扫描端口 namp -p- -A -T4 --min-rate10000 192.168.142.147 有用的信息…

集成旺店通旗舰版售后单至MySQL数据库

旺店通旗舰版-售后单集成到MySQL的技术实现 在数据驱动的业务环境中&#xff0c;如何高效、准确地将旺店通旗舰奇门的数据集成到MySQL数据库&#xff0c;是许多企业面临的重要挑战。本文将分享一个具体的系统对接案例&#xff1a;旺店通旗舰版-售后单-->BI泰海-售后订单表(…

随着FAB的发布,在FAB中使用Megascans的简单方法(适用于Unreal Engine 5)

UE5系列文章目录 文章目录 UE5系列文章目录前言一、如何在2024年12月31之前免费获取Quixel Megascans所有资源 前言 随着FAB的发布,Quixel Megascans的资源在2024年12月31号之后将不再免费&#xff0c;一个资源1美元 Fab是Epic Games推出的一个全新的数字内容平台&#xff0c;…

论文阅读:Computational Long Exposure Mobile Photography (二)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

Linux云计算 |【第五阶段】PROJECT3-DAY1

主要内容&#xff1a; 跳板机&#xff08;堡垒机&#xff09;的概念、部署JumpeServer 一、跳板机&#xff08;堡垒机&#xff09;的概念 跳板机&#xff08;Jump Server 或 Bastion Host&#xff09;是一种网络安全设备或服务器&#xff0c;也称堡垒机&#xff0c;是一类可作…

一款根据图片内的文字,把图片分类的软件

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

文件操作:Xml转Excel

1 添加依赖 Spire.Xls.jar <dependency><groupId>e-iceblue</groupId><artifactId>spire.xls</artifactId><version>5.3.3</version></dependency>2 代码使用 package cctd.controller;import com.spire.xls.FileFormat; im…

从底层技术到实际应用:Claude与ChatGPT谁更适合学术写作?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 使用大模型智能AI进行学术写作和科研已经成为学者、研究人员和高校学生的强大助手。Anthropic的Claude和OpenAI的ChatGPT作为该领域的两个主要参与者&#xff0c;正在不断发展和完善。随…

linux 磁盘配额 quota

增加一个facl的的知识点&#xff1a; linux中默认的文件系统支持facl&#xff0c;如果是新挂载的分区&#xff0c;则不支持facl应用。需要在挂载文件系统时使用-o acl选项来启用facl支持。如下图显示 在/etc/fstab添加defaults,acl 1.启用磁盘配额功能&#xff1a;修改/etc/f…

qt QMessageBox详解

1、概述 QMessageBox是Qt库中的一个类&#xff0c;它用于在图形用户界面&#xff08;GUI&#xff09;程序中显示消息框。消息框是一种用于向用户显示信息、警告、错误或询问用户确认的对话框。QMessageBox可以显示文本、图标和按钮&#xff0c;并允许自定义按钮的文本和功能。…

qt QResizeEvent详解

1、概述 QResizeEvent是Qt框架中用于处理窗口或控件大小变化事件的一个类。当用户调整窗口或控件的尺寸时&#xff0c;Qt会生成一个QResizeEvent事件&#xff0c;并将其发送到相应的窗口或控件。开发者可以通过重载窗口或控件的resizeEvent()方法来响应这个事件&#xff0c;并…

黑科技安利 | 超好用的背景去除软件

背景 如果一幅主图里存在其它颜色的背景色调&#xff0c;希望变成白色或者特定色彩/背景图片 推荐 1. Microsoft PowerPoint里自带的“清除背景”/设置透明色 这个功能超级好用&#xff0c;基本满足我日常涉及的90%的清除白色背景的需求 2. https://www.remove.bg/ 这个网…