leetcode919. 完全二叉树插入器,队列只保存右子树为空的节点

leetcode919. 完全二叉树插入器

完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。
设计一种算法,将一个新节点插入到一棵完全二叉树中,并在插入后保持其完整。
实现 CBTInserter 类:
CBTInserter(TreeNode root) 使用头节点为 root 的给定树初始化该数据结构;
CBTInserter.insert(int v) 向树中插入一个值为 Node.val == val的新节点 TreeNode。使树保持完全二叉树的状态,并返回插入节点 TreeNode 的父节点的值;
CBTInserter.get_root() 将返回树的头节点。
示例 1:
在这里插入图片描述
输入
[“CBTInserter”, “insert”, “insert”, “get_root”]
[[[1, 2]], [3], [4], []]
输出
[null, 1, 2, [1, 2, 3, 4]]
解释
CBTInserter cBTInserter = new CBTInserter([1, 2]);
cBTInserter.insert(3); // 返回 1
cBTInserter.insert(4); // 返回 2
cBTInserter.get_root(); // 返回 [1, 2, 3, 4]

在这里插入图片描述

题目分析

CBTInserter 类用于在完全二叉树(CBT)中插入新节点。完全二叉树是一种特殊的二叉树,除了最后一层外,每一层都是满的,最后一层的节点都尽可能地靠左排列。

算法介绍

该类使用了一个队列 q 来存储所有右子树为空的节点。在插入新节点时,它会找到队列中的第一个节点(即队首节点),如果该节点的左子树为空,则将新节点作为其左子树;如果左子树非空但右子树为空,则将新节点作为其右子树。然后根据需要更新队列。

算法步骤

  1. 初始化:在构造函数中,将根节点加入队列,然后遍历队列,确保队列只包含右子树为空的节点。
  2. 插入新节点
    • 创建新节点。
    • 检查队首节点的左子树和右子树。
    • 将新节点作为队首节点的左子树或右子树。
    • 根据需要更新队列。
  3. 获取根节点:返回树的根节点。

算法流程图

开始
根节点是否为空
创建新节点作为根节点
将根节点加入队列
队列是否为空
结束
队首节点左子树是否为空
将新节点作为队首节点左子树
队首节点右子树是否为空
将新节点作为队首节点右子树
队首节点出队
新节点入队

具体代码

class CBTInserter {
    TreeNode *root;
    queue<TreeNode*> q;
public:
    CBTInserter(TreeNode* root) : root(root) {
        q.push(root);
        while (!q.empty()) {    // 队列只保存右子树为空的节点
            if (q.front() -> left) q.push(q.front() -> left);
            if (q.front() -> right) { q.push(q.front() -> right); q.pop(); }
            else break;   // 队首节点的右孩子为空,则停止
        }
    }
    
    int insert(int val) {
        auto node = new TreeNode(val);
        int res = q.front() -> val;
        if (!q.front() -> left) {   // 左子树为空
            q.front() -> left = node;
        } else {    // 左子树非空、右子树为空
            q.front() -> right = node;
            q.pop();    // 队首节点左右两侧均已插入、弹出队首节点
        } 
        q.push(node);
        return res;
    }
    
    TreeNode* get_root() {
        return root;
    }
};

算法分析

  • 复杂度:插入操作的时间复杂度为 O(1),因为队列的进出操作都是常数时间。
  • 易错点:在更新队列时,需要确保队列只包含右子树为空的节点。
  • 注意点:在插入新节点后,需要将其加入队列。

相似题目

题目链接
完全二叉树的节点个数LeetCode
完全二叉树的层序遍历LeetCode
完全二叉树的最近公共祖先LeetCode

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

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

相关文章

Mysql安装,mysql-installer-community-8.0.41.0

“windowR"键弹出运行框&#xff0c;输入”cmd"进入window命令提示符&#xff0c;输入“mysql -uroot -p"按下回车&#xff0c;再输入密码&#xff0c;按下回车&#xff0c;出现下面界面则是配置成功。 默认会在 C:\Program Files\MySQL\MySQL Server 8.0\bin …

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

1.21学习记录

misc 2023isctf 你说爱我尊嘟假嘟 这题有点脑洞&#xff0c;需要把你说爱我换成Ook.将尊嘟换为Ook&#xff01;假嘟换成Ook&#xff1f;&#xff08;根据语气进行猜测吧&#xff09;用在线工具解密最后用base64解密即可 2023isctf 杰伦可是流量明星 解压后是一个MP3文件&am…

BaseCTF_Misc_week3

目录 broken.mp4 白丝上的flag 这是一个压缩包 纯鹿人 外星信号 我要吃火腿 Base Revenge broken.mp4 附件两个MP4文件&#xff0c;第一个可以播放&#xff0c;内容是视频受损的修复啥的。第二个破损了&#xff0c;那么就根据第一个视频的网页名称搜索找到相应的网页&…

Flutter项目和鸿蒙平台的通信

Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候&#xff0c; Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…

@TransactionEventListener的关键源码整理

前言&#xff1a;本篇文章不属于保姆级的&#xff0c;主要是方便自己回忆用的&#xff0c;所以需要阅读者具有一定的Spring源码基础。 总结&#xff1a; TransactionEventListener本质上还是EventListener&#xff0c;事件的发布还是Spring通用的那一套事件发布机制。EventLis…

StarRocks强大的实时数据分析

代码仓库&#xff1a;https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始&#xff1a;StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化…

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用

SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务&#xff08;适用于小型应用&#xff09;二. 使用调度框架…

蓝桥与力扣刷题(73 矩阵置零)

题目&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

源码分析之Openlayers中样式篇Text类

访问Openlayers网站(https://jinuss.github.io/Openlayers_map_pages/&#xff0c;网站是基于Vue3 Openlayers&#xff0c;里面有大量的实践和案例。觉得还不错&#xff0c;可以 给个小星星Star&#xff0c;鼓励一波 https://github.com/Jinuss/OpenlayersMap哦~ 概述 Text 类…

uniapp开发 swiper 上下滚动

一、效果图 二、代码: 在uni-app中使用swiper组件实现上下滚动(垂直滚动)的功能可以通过设置vertical属性来实现。swiper组件默认是水平滚动的,通过将vertical属性设置为true,可以改变滚动方向为垂直。 <template><view><swiper

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法&#xff0c;分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发&#xff0c;测试&#xff0c;生产等编译部署环境&#xff08;每一个环境…

异或和之和

题目&#xff1a; 0异或和之和 - 蓝桥云课 异或和之和 题目描述 给定一个数组 Ai​&#xff0c;分别求其每个子段的异或和&#xff0c;并求出它们的和。或者说&#xff0c;对于每组满足 1≤L≤R≤n 的 L,R&#xff0c;求出数组中第 L 至第 R 个元素的异或和。然后输出每组 …

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

Java基础——概念和常识(语言特点、JVM、JDK、JRE、AOT/JIT等介绍)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

Java设计模式:创建型模式→建造者模式

Java 建造者模式详解 1. 定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;允许使用多个简单的对象一步步构建一个复杂的对象。该模式使用一个建造者对象来构造一个最终的对象&#xff0c;提供清晰的分步构建流程&#xff0c;从而使得…

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合&#xff0c;它继承自IEnumerable但具有一些关键的区别&#xff0c;使得它在处理数据库查询时非常有用&#xff0c;普通集…