DAY26||669.修建二叉树 |108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树

news2024/10/10 2:22:58

669.修剪二叉树

题目:669. 修剪二叉搜索树 - 力扣(LeetCode)

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

示例 2:

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

思路:一层层往下遍历(递归当然返回是下一层返回给上一层,前序遍历的写法,中节点的处理逻辑就是查看是否在区间内,如果不是,就继续往下找,左子树遇到删除节点的从右子树找补上的节点,为什么不找左子树因为当前删除节点已经不在区间了,那么左子树的值比它小,不理会就行了(其实删除节点的时候就不要了,补上的树分支已经不一样了)右子树同理。

所以递归代码挺简洁的,模拟走一遍流程就能明白了。

递归

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root==NULL)return NULL;
        
        if(root->val<low)return trimBST(root->right,low,high);//中,在左区间外的,继续遍历右子树找到值补上位置并返回上一层,右区间外的也一样
        if(root->val>high)return trimBST(root->left,low,high);

        root->left=trimBST(root->left,low,high);//左
        root->right=trimBST(root->right,low,high);//右

        return root;



    }
};

迭代 

在剪枝的时候,可以分为三步:

  • 将root移动到[L, R] 范围内,注意是左闭右闭区间
  • 剪枝左子树
  • 剪枝右子树

 就是找到范围的root,定义cur指针再分别遍历修剪左右子树,修剪逻辑同递归写法。

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(!root)return nullptr;
        while(root!=nullptr&&(root->val<low||root->val>high))//找到在区间内的根节点
        {
            if(root->val<low)root=root->right;
            else root=root->left;
        }
        TreeNode*cur=root;
        while(cur)//修剪左子树
        {
            while(cur->left&&cur->left->val<low)
            cur->left=cur->left->right;
            cur=cur->left;//指针指向下一个
        }

        cur=root;//修剪右子树
        while(cur)
        {
            while(cur->right&&cur->right->val>high)
            cur->right=cur->right->left;
            cur=cur->right;
        }
        return root;

    }
};

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

题目:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

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

前提:

平衡二叉树(Balanced Binary Tree)是一种特殊的二叉树,它在结构上保持一定的平衡性,以确保操作的效率较高。最常见的平衡二叉树类型是AVL树红黑树。平衡的定义通常是指树中任意节点的两个子树的高度差不能超过一定的限制。对于AVL树,这个限制是1。

具体特点:

  • AVL树:对于每个节点,左子树和右子树的高度差(也称为平衡因子)不能超过1。AVL树的插入、删除和查找操作的时间复杂度都为O(log n)。
  • 红黑树:这是一种弱平衡的二叉搜索树,确保最长路径不会超过最短路径的两倍,从而保证O(log n)的操作时间复杂度。

递归 

class Solution {
    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;

    }
};

迭代法可以通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下标,一个队列放右区间下标。但跳过了这个写法。。。待补

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

题目:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。

示例 1:

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

  • 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
  • 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

  • 输入:root = [0,null,1]
  • 输出:[1,null,1]

示例 3:

  • 输入:root = [1,0,2]
  • 输出:[3,3,2]

示例 4:

  • 输入:root = [3,2,4,1]
  • 输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0 和 104 之间。
  • 每个节点的值介于 -104 和 104 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树。

思路:

题目太长差点没看懂,其实就是更新后的每一个节点是所有比它大于或等于的值的和 。本题适合的遍历顺序是后中前,然后类似双指针法,cur的值只要累加pre就行,然后pre跟随cur的步伐移动。

递归法

反中序遍历。

class Solution {
    int pre=0;
    private:
    void traversal(TreeNode*cur)
    {
        if(cur==nullptr)return;
        traversal(cur->right);//右

        cur->val+=pre;//中,累加前一个数的值
        pre=cur->val;

        traversal(cur->left); //作       
    }
public:
    TreeNode* convertBST(TreeNode* root) {
        pre=0;
        traversal(root);
        return root;

    }
};

迭代法 

模拟这个过程,模板题。

统一迭代法的一种。

栈模拟反中序遍历过程。

class Solution {
    private:
    int pre;
    void traversal(TreeNode*root)
    {
        stack<TreeNode*>st;//注意这里入栈的是指针
        TreeNode*cur=root; 
        while(cur!=NULL||!st.empty())   
        {
            if(cur!=NULL)
            {
                st.push(cur);//右
                cur=cur->right;
            }
            else
            {
                cur=st.top();
                st.pop();
                cur->val+=pre;//中
                pre=cur->val;

                cur=cur->left;//左

            }
        }
    }
public:
    TreeNode* convertBST(TreeNode* root) {
        pre=0;
        traversal(root);
        return root;

    }
};

 二叉树完结撒花,总体来说不是很难,但是熟练掌握程度还得看自己是否能独立做出来了。

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径 (opens new window)也用了前序,这是为了方便让父节点指向子节点。

总结图

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

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

相关文章

ArcGIS属性表怎么连接Excel表格?

ArcGIS中&#xff0c;属性表是存储空间要素非几何特征属性的重要工具。有时&#xff0c;我们需要将这些属性与外部数据&#xff0c;如Excel表格中的数据进行连接。以下是如何在ArcGIS中实现这一过程的步骤。 要把Excel表里的数据导入到ArcGIS里的地图数据里面&#xff0c;对数…

[单master节点k8s部署]34.ingress 反向代理(一)

ingress是k8s中的标准API资源&#xff0c;作用是定义外部流量如何进入集群&#xff0c;并根据核心路由规则将流量转发到集群内的服务。 ingress和Istio工作栈中的virtual service都是基于service之上&#xff0c;更细致准确的一种流量规则。每一个pod对应的service是四层代理&…

City Builder Urban 城市都市街道建筑场景模型

目前拥有178项优质资产。 城市建设者:Urban一个高质量的资产包,专为快速的纽约式城市建设而设计,与所有渲染管道兼容。 资产 56个带LOD的街道和屋顶道具 13个可堆叠的建筑部件与LOD混合搭配 10个不同尺寸的建筑装饰/分离器,总共40个装饰 请参阅秋季列表的技术细节 1个带有C…

【redis-07】redis实现主从复制架构和底层原理

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

UE管理内容 —— FBX Static Mesh Pipeline

目录 General Setup Export Mesh Static Mesh LODs FBX导入流程中加入 静态网格体 支持后&#xff0c;将网格体从3D软件加入虚幻引擎的操作便极为简便&#xff1b;网格体导入后&#xff0c;网格体的材质纹理&#xff08;仅限漫反射和法线贴图&#xff09;也将被导入&#xf…

Bianchi模型、python计算及ns3验证

由于项目与学习需要,最近学习了bianchi模型,并在python中进行了公式->代码的转化,仿真结果与ns3结果对比。 本文更多的是理解模型各个部分的含义、把各个简单的推导过程转化为python、ns3对比: 1 理论吞吐与传输概率、传输成功概率、包长、速率、排队时间、成功传输时…

基于双PI控制器和SVPWM的定转子双永磁同步电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 永磁同步电机的基本结构和工作原理 4.2 双PI控制器的设计方法 4.3 SVPWM 的实现原理 5.完整工程文件 1.课题概述 为了实现定转子双永磁同步电机的高性能控制&#xff0c;通常采用双 PI 控制器和 S…

Linux系统创建新分区并挂载的方法

一、引言 本文以CentOS为例讲述Linux系统创建新分区并挂载的方法。如下图所示&#xff0c;用fdisk -l命令可以看到该CentOS系统下有一个磁盘/dev/vda&#xff0c;其容量为2199G&#xff0c;即2T。该磁盘有两个分区&#xff1a;vda1和vda2&#xff1a; 用lsblk命令可以查看到磁…

Ancient City Ruins 古代城市遗址废墟建筑游戏场景

这个包包含450多个古代遗迹预制件,可组合模块化预制件和许多建筑元素。它适用于室内和室外,并允许不同层次的定制建筑。 [亮点] 超过450个古代遗迹的预制件 可组合的模块化预制件 许多建筑元素 适用于室内和室外 允许不同层次的自定义建筑 预制房间和建筑 废墟装饰道具 基本自…

jQuery——循环翻页

本文分享到此结束&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享jQuery中自动翻页功能的学习。

【含文档】基于Springboot+Android的个人财务系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题&#x1f6a9;题意与思路 ⭐返回贪心&#x1f6a9;原理&#xff08;反悔池&#xff09;&#x1f6a9;落实到题&#x1f6a9;AC code ⭐练习题⭐END&#x1f31f;交流方式 ⭐例题 经典例题&#xff1a; 871. 最低加油次数 &#x1f6a9;题意与思路 题意&#xf…

【光追模组】使命召唤7黑色行动光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升

大家好&#xff0c;今天小编我给大家继续引入一款游戏mod&#xff0c;这次这个模组主要是针对使命召唤7黑色行动进行修改&#xff0c;如果你觉得游戏本身光影有缺陷&#xff0c;觉得游戏色彩有点失真的话&#xff0c;或者说你想让使命召唤7这款游戏增加对光线追踪的支持的话&am…

RESTful风格接口+Swagger生成Web API文档

RESTful风格接口Swagger生成Web API文档 文章目录 RESTful风格接口Swagger生成Web API文档1.RESTful风格接口RESTful简介RESTful详细图示常见http状态码springboot实现RESTfulRESTful springboot设计实例demo 2.Swagger生产Web API文档Swagger简介使用Swagger1.加入依赖2.配置S…

C++笔记之shared_ptr的reset()函数

C++笔记之shared_ptr的reset()函数 code review! std::shared_ptr 的 reset() 函数用于管理指针的生命周期。以下是它的几种用法和功能: 用法 无参数调用: reset() 会释放当前管理的对象,并将指针置为空。std::shared_ptr<int> ptr = std::make_shared

数据库原理及应用:用实例理解关系代数(传统集合运算和专门关系运算)

&#xff01;注意&#xff01;&#xff1a;本篇博客只是利用实例来更好地理解关系代数&#xff0c;有关本章内容专业的表达式在此篇博客中未被提及。本博客中关系和表格这两个表达是等价的。 关系操作分为传统集合运算和专门关系运算&#xff0c;这一篇博客我们将从实例进行关系…

Go基本数据结构

1.jdk丰富的数据结构 Jdk提供了许多基本数据结构的实现&#xff0c;这些数据结构是Java Collections Framework的一部分&#xff0c;位于java.util包中。以下是一些常见的数据结构&#xff1a; ArrayList&#xff1a;一个可调整大小的数组实现&#xff0c;支持快速随机访问。 …

[Algorithm][贪心][合并区间][无重叠区间][用最少数量的箭引爆气球]详细讲解

目录 1.合并区间1.题目链接2.算法原理详解3.代码实现 2.无重叠区间1.题目链接2.算法原理详解3.代码实现 3.用最少数量的箭引爆气球1.题目链接2.算法原理详解3.代码实现 1.合并区间 1.题目链接 合并区间 2.算法原理详解 区间问题思路&#xff1a; 排序 左端点(本题)右端点 根…

Docker安装及使用记录

本文汇总一下 Docker 的安装过程和使用过程中的问题 安装过程 Windows Linux 更新软件源&#xff1a;Linux安装前可先更新以下各自发行版包管理器的软件源 卸载旧版本&#xff1a;如果之前安装过的话&#xff0c;可以先卸载 yum remove docker docker-common docker-sel…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…