二叉树题目:在二叉树中增加一行

news2025/1/9 4:23:37

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:在二叉树中增加一行

出处:623. 在二叉树中增加一行

难度

5 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root 和两个整数 val \texttt{val} val depth \texttt{depth} depth,在给定的深度 depth \texttt{depth} depth 处添加一行值为 val \texttt{val} val 的结点。

注意,根结点 root \texttt{root} root 位于深度 1 \texttt{1} 1

添加规则如下:

  • 给定整数 depth \texttt{depth} depth,对于深度为 depth   -   1 \texttt{depth - 1} depth - 1 的每个非空树结点 cur \texttt{cur} cur,创建两个值为 val \texttt{val} val 的树结点作为 cur \texttt{cur} cur 的左子树根和右子树根。
  • cur \texttt{cur} cur 原来的左子树应该是新的左子树根的左子树。
  • cur \texttt{cur} cur 原来的右子树应该是新的右子树根的右子树。
  • 如果 depth   =   1 \texttt{depth = 1} depth = 1 意味着不存在深度 depth   -   1 \texttt{depth - 1} depth - 1,则创建一个值为 val \texttt{val} val 的树结点作为新的根结点,原始树作为新的根结点的左子树。

示例

示例 1:

示例 1

输入: root   =   [4,2,6,3,1,5],   val   =   1,   depth   =   2 \texttt{root = [4,2,6,3,1,5], val = 1, depth = 2} root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5] \texttt{[4,1,1,2,null,null,6,3,1,5]} [4,1,1,2,null,null,6,3,1,5]

示例 2:

示例 2

输入: root   =   [4,2,null,3,1],   val   =   1,   depth   =   3 \texttt{root = [4,2,null,3,1], val = 1, depth = 3} root = [4,2,null,3,1], val = 1, depth = 3
输出: [4,2,null,1,1,3,null,null,1] \texttt{[4,2,null,1,1,3,null,null,1]} [4,2,null,1,1,3,null,null,1]

数据范围

  • 树中结点数目在范围 [1,   10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • 树的深度在范围 [1,   10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • -100 ≤ Node.val ≤ 100 \texttt{-100} \le \texttt{Node.val} \le \texttt{100} -100Node.val100
  • -10 5 ≤ val ≤ 10 5 \texttt{-10}^\texttt{5} \le \texttt{val} \le \texttt{10}^\texttt{5} -105val105
  • depth \texttt{depth} depth 的最小可能值为 1 \texttt{1} 1,最大可能值为树的深度加 1 \texttt{1} 1

解法一

思路和算法

如果 depth = 1 \textit{depth} = 1 depth=1,则创建值为 val \textit{val} val 的新的根结点,将原二叉树作为新的根结点的左子树,返回新的根结点即可。

depth > 1 \textit{depth} > 1 depth>1 时,添加一行结点不会改变根结点,只要定位到添加结点的层,完成添加操作之后返回根结点即可。

根据添加规则,结点应该添加在深度 depth \textit{depth} depth 的行。令 level = depth − 1 \textit{level} = \textit{depth} - 1 level=depth1,需要定位到第 level \textit{level} level 层的全部结点,对于该层的每个结点添加两个子结点,并将原左子树和原右子树分别作为新左子结点的左子树和新右子结点的右子树。

定位到特定层添加结点可以使用深度优先搜索实现,深度优先搜索的过程中需要记录位于当前结点时应该添加在当前子树的哪一层,初始时位于根结点,层数 level = depth − 1 \textit{level} = \textit{depth} - 1 level=depth1。搜索过程中,如果 level = 1 \textit{level} = 1 level=1,则对于当前结点添加两个子结点,并将原左子树和原右子树分别作为新左子结点的左子树和新右子结点的右子树。如果 level > 1 \textit{level} > 1 level>1,则对于每个非空结点,将层数减 1 1 1 之后继续深度优先搜索。

上述过程是一个递归的过程,递归的终止条件是 level = 1 \textit{level} = 1 level=1,当 level > 1 \textit{level} > 1 level>1 时调用递归。

代码

class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        if (depth == 1) {
            return new TreeNode(val, root, null);
        }
        insert(root, val, depth - 1);
        return root;
    }

    public void insert(TreeNode node, int val, int level) {
        TreeNode left = node.left, right = node.right;
        if (level == 1) {
            node.left = new TreeNode(val, left, null);
            node.right = new TreeNode(val, null, right);
        } else {
            if (left != null) {
                insert(left, val, level - 1);
            }
            if (right != null) {
                insert(right, val, level - 1);
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点最多访问一次。

  • 空间复杂度: O ( depth ) O(\textit{depth}) O(depth)。空间复杂度主要是递归调用的栈空间,栈空间的深度是 O ( depth ) O(\textit{depth}) O(depth)

解法二

思路和算法

也可以使用广度优先搜索实现,具体做法是使用层序遍历定位到添加结点的层,然后对于该层的每个结点添加两个子结点,并将原左子树和原右子树分别作为新左子结点的左子树和新右子结点的右子树。

从根结点开始依次遍历每一层的结点,在层序遍历的过程中需要记录遍历的层数,并区分不同结点所在的层,确保每一轮访问的结点为同一层的全部结点。遍历每一层结点之前首先得到当前层的结点数,即可确保每一轮访问的结点为同一层的全部结点。遍历完一层结点之后需要将层数加 1 1 1

使用队列存储待访问的结点,初始时队列中只有根结点,层数为 1 1 1。当层数等于 depth − 1 \textit{depth} - 1 depth1 时,队列中的结点即为需要添加子结点的全部结点,对于队列中的每个结点添加两个子结点,并将原左子树和原右子树分别作为新左子结点的左子树和新右子结点的右子树。

代码

class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        if (depth == 1) {
            return new TreeNode(val, root, null);
        }
        int level = 1;
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty() && level < depth - 1) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                TreeNode left = node.left, right = node.right;
                if (left != null) {
                    queue.offer(left);
                }
                if (right != null) {
                    queue.offer(right);
                }
            }
            level++;
        }
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            TreeNode left = node.left, right = node.right;
            node.left = new TreeNode(val, left, null);
            node.right = new TreeNode(val, null, right);
        }
        return root;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点最多被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

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

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

相关文章

WiFi模块的环境可持续性:可再生能源、材料创新与碳足迹管理

随着数字化时代的到来&#xff0c;WiFi模块已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;这种便利也伴随着对环境的一定影响。本文将深入研究WiFi模块在环境可持续性方面的挑战和机遇&#xff0c;重点关注可再生能源的应用、材料创新以及碳足迹管理。 1. 可…

NB-IoT水表和LoRa水表有什么区别?

在众多物联网技术中&#xff0c;NB-IoT和LoRa脱颖而出&#xff0c;广泛应用于智能水表的制造。那么&#xff0c;这两种水表究竟有何区别呢&#xff1f;下面&#xff0c;小编来为大家详细的讲下NB-IoT和LoRa这两者的工作原理以及两者的区别之处&#xff0c;一起来看下吧&#xf…

图片路径名动态生成

写成这样也可以 :src"./src/assets/ScreenLeft/btn${isShowLeft ? Show : Hide}.png"为了节省开销&#xff0c;这种小图标&#xff0c;可以用i标签 const imgUrl ref("icon1");<iclass"w-50px h-50px":style"{backgroundImage: url(./…

老师们看过来,成绩发布原来可以这么简单

成绩发布不再让你头大&#xff01;不再需要每次都要手动查找学生成绩&#xff0c;浪费宝贵的休息时间!现在&#xff0c;只需要掌握一些小技巧&#xff0c;就能轻松实现学生自助查询成绩&#xff01; 引入数据库管理软件 可以引入一些数据库管理软件&#xff0c;例如MySQL、Pos…

Scala 泛型编程

1. 泛型 Scala 支持类型参数化&#xff0c;使得我们能够编写泛型程序。 1.1 泛型类 Java 中使用 <> 符号来包含定义的类型参数&#xff0c;Scala 则使用 []。 class Pair[T, S](val first: T, val second: S) {override def toString: String first ":" sec…

高压放大器的作用和优势是什么

高压放大器是一种专门用于放大高电压信号的设备&#xff0c;它具有许多重要的作用和优势。在以下的文章中&#xff0c;我们将详细介绍高压放大器的作用和优势。 高压放大器的作用之一是在实验室和工程应用中提供对高压信号的放大和控制。许多应用领域&#xff0c;如实验物理、电…

C/C++数据结构-链表-链表合并排序输出

文章目录 前言例题题解带头结点不带头结点 前言 这个小例题涵盖的知识点还是非常多的。包括链表的定义&#xff0c;链表的尾插法&#xff0c;链表的遍历&#xff0c;冒泡排序用链表实现。链表可以使用带头结点和不带头结点的形式&#xff0c;各有千秋。 本文完整版使用带头结点…

美团圈圈私域加群app拉新 单价高一手渠道整理

美团圈圈为我们现在主推产品 可以通过”聚量推客“ 申请推广 一手数据&#xff0c;外面很多其它的数据都会阉割的很厉害&#xff0c;可以对比 下面介绍下圈圈的优势&#xff0c;我们目前圈圈对外结算时间为11天&#xff08;因为美团官方有个要求 10天内退群无效&#xff09;&…

技能证里的天花板—阿里云云计算架构师ACE认证!

在当今的社会中&#xff0c;想要获得一份好工作、得到丰厚的报酬&#xff0c;唯一的方法就是证明自己优秀&#xff0c;能给公司创造价值&#xff0c;是大多数公司想要看到的。 那么在面试过程中&#xff0c;怎么样才能让面试官一眼就记住呢&#xff1f;那一定是有一份足够优秀…

Java生成二维码并打印二维码和文字信息

目录 1、生成二维码&#xff0c;并调用画布进行二维码和文字的描绘。 2、主程序&#xff1a;获取打印机&#xff0c;并打印内容 3、打印效果 参考文献&#xff1a; 前期工作是安装好打印机驱动&#xff0c;可连接打印机。 添加三个依赖jar&#xff1a; 具体见文底的参考文献…

什么情况会造成电表不走数?

电表是衡量用电量的重要设备&#xff0c;一旦出现不走数的情况&#xff0c;不仅会影响用户对用电量的准确计算&#xff0c;还可能造成电费纠纷。那么&#xff0c;究竟什么情况下会造成电表不走数呢&#xff1f;接下来&#xff0c;小编来为大家介绍下&#xff0c;一起来看下吧&a…

学习使用php实现汉字验证码

学习使用php实现汉字验证码 <?php //开启session &#xff0c;方便验证 session_start(); //创建背景画布 $image imagecreatetruecolor(200, 60); $background imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $background);//创建背景画布 for ($…

【腾讯云HAI域探秘】AI让我变成灵魂画手

【腾讯云HAI域探秘】AI让我变成灵魂画手 文章目录 【腾讯云HAI域探秘】AI让我变成灵魂画手前言环境搭建进入 StableDiffusionWebUI使用 高性能应用服务HAI 部署的 StableDiffusionWebUI 快速进行AI绘画总结 前言 最近有幸参与了腾讯云举办的 腾讯云 HAI 产品体验活动。在这个过…

解决VS中文编译时出现:常量中有换行符

错误如下 首先确定文件编码格式已经是utf-8了&#xff0c;然后在有中文的情况的下&#xff0c;编译时会报错&#xff0c;真的很恶心 tabWidget.addTab(widget, tr("材料库"));tabWidget.addTab(widget1, tr("B"));解决方案 通过在项目里设置编译选项: /utf…

【docker使用Jar自定义镜像:基于windows】

在一个空文件夹中创建Dockerfile 将jar包复制到该路径下 在Dockerfile中添加以下内容 # 指定基础镜像 FROM java:8-alpine# 和java项目的包 COPY ./study_dockerfile-1.0.0.jar /tmp/app.jar# 暴露端口 EXPOSE 8081# 入口&#xff0c;java项目的启动命令 ENTRYPOINT java -jar…

开发ros一定要买树莓派吗?

结论&#xff1a;开发ros不一定要买树莓派&#xff0c;但是买一个会更方便&#xff0c;市场价410元/块&#xff1b; 开发ros机器人的时候&#xff0c;分为上位机和下位机2个控制中心&#xff0c; 其中下位机基本就是用STM32控制一个驱动电机。负责这个运动方向和速度。&#…

算法通关村第五关-白银挑战实现队列

大纲 队列基础队列的基本概念和基本特征实现队列队列的基本操作Java中的队列 队列基础 队列的基本概念和基本特征 队列的特点是节点的排队次序和出队次序按入队时间先后确定&#xff0c;即先入队者先出队&#xff0c;后入队者后出队&#xff0c;即我们常说的FIFO(first in fi…

感受野(Receptive Field)理解和计算

[Toc](感受野(Receptive Filed)的理解和计算) 感受野定义 在卷积神经网络中&#xff0c;感受野(Receptive Filed)是经过神经网络后生成的指特征图上的某个像素点所对应输入图像的区域。 针对上面的图&#xff0c;经过conv2 卷积神经网络后&#xff0c;生成了22 的特征图&…

微软曝光!ChatGPT 真实参数只有 200 亿?大模型评测基准已经失去意义?丨 RTE 开发者日报 Vol.76

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…