《剑指 Offer》专项突破 - 面试题 43 : 在完全二叉树中添加节点(两种方法 + C++ 实现)

目录

前言

方法一

方法二


 


前言

题目链接:LCR 043. 完全二叉树插入器 - 力扣(LeetCode)

题目

在完全二叉树中,除最后一层之外其他层的节点都是满的(第 n 层有 个节点)。最后一层的节点可能不满,该层所有的节点尽可能向左靠拢。例如,下图中的 4 棵二叉树均为完全二叉树。实现数据结构 CBTInserter 有如下 3 种方法。

  • 构造函数 CBTInserter(TreeNode* root),用一棵完全二叉树的根节点初始化该数据结构。

  • 函数 insert(int v) 在完全二叉树中添加一个值为 v 的节点,并返回被插入节点的父节点。例如,在下图 (a) 所示的完全二叉树中添加一个值为 7 的节点之后,二叉树如下图 (b) 所示,并返回节点 3。在下图 (b) 所示的完全二叉树中添加一个值为 8 的节点之后,二叉树如下图 (c) 所示,并返回节点 4。在下图 (c) 所示的完全二叉树中添加节点 9 会得到下图 (d) 所示的二叉树并返回节点 4。

  • 函数 get_root() 返回完全二叉树的根节点。


方法一

在完全二叉树中添加新节点顺序看起来是从上到下按层从左到右添加的,这就是典型的二叉树广度优先搜索的顺序。我们可以每次在完全二叉树中按照广度优先搜索的顺序找出第 1 个左子节点或右子节点还有空缺的节点。如果它没有左子节点,那么新的节点就作为它的左子节点;如果它没有右子节点,那么新的节点就作为它的右子节点

例如,在上图 (a) 所示的完全二叉树中添加新的节点 7 时,节点 3 是按照广度优先搜索的顺序找到的第 1 个缺少子节点的节点,它已经有左子节点但没有右子节点,因此节点 7 就插入节点 3 的右子节点的位置。同样,在上图 (b) 所示的完全二叉树中添加新的节点 8 时,节点 4 是按照广度优先搜索的顺序找到的第 1 个缺少子节点的节点,它既没有左子节点也没有右子节点,因此节点 8 插入节点 4 的左子节点的位置。

接下来考虑效率优化。在完全二叉树中添加节点时需要按照广度优先搜索的顺序找出第 1 个缺少子节点的节点。其实没有必要在每次插入新的节点时都从完全二叉树的根节点开始从头进行广度优先搜索

例如,在上图 (a) 所示的完全二叉树中添加新的节点 7 时,从根节点开始按照广度优先搜索的顺序找出节点 3 是第 1 个缺少子节点的节点,由此可知,在节点 3 之前被遍历过的所有节点(节点 1 和节点 2)的左右子节点都已经存在,并且当节点 7 插入节点 3 的右子节点的位置之后节点 3 的左右子节点都已经存在。下次再插入新的节点时,就没有必要从根节点开始,而是跳过节点 1、节点 2 和节点 3,直接从节点 4 开始查找第 1 个还缺少子节点的节点。

class CBTInserter {
public:CBTInserter(TreeNode* root) {this->root = root;
​q.push(root);TreeNode* front = root;while (front->left && front->right){q.pop();q.push(front->left);q.push(front->right);front = q.front();}}int insert(int v) {TreeNode* newNode = new TreeNode(v);TreeNode* front = q.front();if (front->left == nullptr){front->left = newNode;}else{front->right = newNode;q.pop();q.push(front->left);q.push(front->right);}return front->val;}TreeNode* get_root() {return root;}
private:TreeNode* root;queue<TreeNode*> q;
};


方法二

class CBTInserter {
public:CBTInserter(TreeNode* root) {queue<TreeNode*> q;q.push(root);while (!q.empty()){TreeNode* front = q.front();q.pop();treeV.push_back(front);if (front->left)q.push(front->left);if (front->right)q.push(front->right);}}int insert(int v) {TreeNode* newNode = new TreeNode(v);treeV.push_back(newNode);
​int parent = (treeV.size() - 1 - 1) / 2;TreeNode* node = treeV[parent];if (node->left == nullptr)node->left = newNode;elsenode->right = newNode;return node->val;}TreeNode* get_root() {return treeV[0];}
private:vector<TreeNode*> treeV;
};

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

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

相关文章

IO进程-day1

1、使用fgets统计给定文件的行数。 #include<stdio.h> #include<string.h> #include<stdlib.h>int main(int argc, const char *argv[]) {if(argc ! 2){printf("inout file error\n");printf("usage:./a.out srcfile destfile\n");ret…

理德外汇名人故事:全球著名的基金经理——布鲁斯·科夫纳

纽约华尔街&#xff08;wall street&#xff09;是纽约市曼哈顿区南部一条大街的名字&#xff0c;长不超过一英里&#xff0c;宽仅11米。它是美国一些主要金融机构的所在地。两旁是陈旧的摩天大楼&#xff0c;这条街上集中了纽约证券交易所、联邦储备银行等金融机构和美国洛克菲…

深入了解C语言:基础、特性与实践

C语言是一门广泛应用于系统编程和嵌入式领域的高效编程语言。通过深入了解其基础、特性以及实际应用&#xff0c;我们能够更好地掌握这门语言&#xff0c;提高编程技能。在本博客中&#xff0c;我们将探讨C语言的各个方面&#xff0c;从基础概念到高级应用&#xff0c;为读者提…

在golang语言中简单使用protobuf时遭遇go_package困难重重

文章目录 前言编写示例示例初始化编写协议文件内容导出协议文件protoc 和 protoc-gen-go执行导出命令 编写协议使用文件 体会总结 前言 Protobuf&#xff0c;全称Protocol Buffers&#xff0c;是一种由Google开发的用于序列化结构化数据的开源数据交换格式&#xff0c;Golang作…

在UE5中使用体积材质

在平时使用UE的材质设置时&#xff0c;经常会看见Material Domain Volume类型&#xff0c;但是却很少使用。其实该类型可以配合体积雾使用&#xff0c;并制作体积效果以弥补自带雾参数的不足。 操作流程 首先找到场景中的ExponentialHeightFog组件&#xff0c;开启体积雾Volu…

SpringBoot整合Redis实现登录失败锁定功能

文章目录 前言一、为何选择Redis作为账户锁定的存储解决方案&#xff1f;二、代码案例讲解1.引入依赖2.配置文件3.示例代码 总结 前言 在现代的软件开发中&#xff0c;安全性和用户体验是至关重要的方面。特别是在身份验证和授权方面&#xff0c;保护用户账户免受恶意访问是至…

【论文精读】SimCLR2

摘要 本文提出了一个半监督学习框架&#xff0c;包括三个步骤&#xff1a;无监督或自监督的预训练&#xff1b;有监督微调&#xff1b;使用未标记数据进行蒸馏。具体改进有&#xff1a; 发现在半监督学习&#xff08;无监督预训练有监督微调&#xff09;中&#xff0c;对于较大…

Linux第61步_“buildroot”构建根文件系统第3步_烧写根文件系统到EMMC中_并完善开发板配置

烧录到EMMC测试&#xff0c;还需进一步测试和配置。 1、删除rootfs”目录下的“rootfs.tar”压缩包 打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换到“linux”目录 输入“ls回车”&#xff0c;列出“linux”目录下的文件和文件夹 输入“cd nfs/回…

xtu oj 1150 n!进制 2.0

题目描述 n!进制是指每i位的权值是(i1)!,每一位的系数为0~i1。 比如n!进制的21 2*2! 1*1! 5。给你一个10进制数&#xff0c;求其n&#xff01;进制的值。 输入 每行一个10进制的整数n,0≤n≤3,628,799。 输出 每行输出一个样例的结果。 样例输入 0 1 10 100 3628799样…

Linux目录操作类命令 less | grep | ln | chattr | 清除日志内容

less 用来浏览超过一页的文件 用 / 可用来查找关键字 q键退出 cat -n 3.txt | less行号显示grep 文本处理工具&#xff0c;以行为单位找关键字 ls -l /boot | grep ^l grep 关键字 文件名 grep runlevel /etc/inittab 参数 -i忽略大小写 -n显示行号 -v排除关键字&#xff0…

数据结构与算法java—算法时间复杂度计算

课程安排 一、数据结构与算法的重要性 数据结构&#xff1a;数据与数据间的关系 1.1、数据结构的研究内容 数据结构&#xff1a;研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。 非数值计算问题中的数学模型不是数学方程&#xff0c;而是诸如…

线程安全性的原理分析学习

初步认识Volatile 一段代码引发的思考 下面这段代码&#xff0c;演示了一个使用volatile以及没使用volatile这个关键字&#xff0c;对于变量更新的影响 package com.sp.demo;/*** author : lssffy* Description :* date : 2024/2/16 18:42*/ public class VolatileDemo {publi…

类和结构体的区别

类&#xff08;class&#xff09;和结构体&#xff08;struct&#xff09;是面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;中常见的两种数据类型&#xff0c;它们在不同的编程语言中有一些共同之处&#xff0c;但也存在一些区别。以下是它们…

MongoDB聚合运算符:$anyElementTrue

$anyElementTrue运算符用来对数组元素进行逻辑判断&#xff0c;如果数组的任何一个元素为true则返回true&#xff0c;否则返回false。空数组返回false。 语法 { $anyElementTrue: [ <expression> ] }<expresssion>必须是能够被解析为数组的表达式。 使用 对于内…

5G——小区搜索流程

小区搜索流程 小区搜索目标&#xff1a;读取到SIB1. 小区搜索流程概述&#xff1a;SIB1在PDSCH信道承载&#xff0c;承载SIB1的信道在哪个位置由PDCCH告诉&#xff0c;而PDCCH的基本信息由MIB告诉&#xff0c;MIB信息由广播信道PBCH广播出去&#xff0c;物理信道解调需要解调…

【机构vip教程】Charles(1):Charles的介绍及安装

Charles Charles 是在 Mac &#xff08;Charles是跨平台的 &#xff09;下常用的网络封包截取工具&#xff0c;在做移动开发、测试时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。Charles是一个HTTP代理服务器,HTTP监视器,反转代…

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子&#xff08;Huffman树&#xff09;二、排队打水&#xff08;排序不等式&#xff09;三、货仓选址&#xff08;绝对值不等式&#xff09;四、耍杂技的牛&#xff08;推公式&#xff09; 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…

【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

【STM32】重定向printf函数

【STM32】重定向printf函数 重定义fputc到串口 /******************************************************************************************/ /* 加入以下代码, 支持printf函数, 而不需要选择use MicroLIB */#if 1 #include <stdio.h> #if (__ARMCC_VERSION > 6…

OpenAI 发布文生视频大模型 Sora,AI 视频要变天了,视频创作重新洗牌!AGI 还远吗?

一、一觉醒来&#xff0c;AI 视频已变天 早上一觉醒来&#xff0c;群里和朋友圈又被刷屏了。 今年开年 AI 界最大的震撼事件&#xff1a;OpenAI 发布了他们的文生视频大模型 Sora。 OpenAI 文生视频大模型 Sora 的横空出世&#xff0c;预示着 AI 视频要变天了&#xff0c;视…