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

文章目录

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

题目

标题和出处

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

出处: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.hqwc.cn/news/157580.html

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

相关文章

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程&#xff08;4.2.6&#xff09; 实例一&#xff1a;Hello world 实例二&#xff1a;访问一个自定义主页 实例三&#xff1a;通过登录跳转到主页 实例四&#xff1a;主页添加静态文件&#xff0c;包含js、css、…

轻松部署Swagger Editor:安装Docker并实现远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

矢量图编辑_Inkscape裁剪与蒙版

文章目录 一、简介二、示例三、裁剪 Clipping四、蒙版 Masking 一、简介 裁剪&#xff08;Clipping&#xff09; 和 蒙版/遮罩&#xff08;masking&#xff09; 是限制对象&#xff08;或对象组&#xff09;哪一部分可见的方法。对于裁剪&#xff0c; 裁剪路径&#xff08;cli…

一副耳机两种体验,好看好听降噪强,FIIL Key Pro上手

户外使用蓝牙耳机时&#xff0c;降噪功能真的是必不可少&#xff0c;特别是通勤高峰期&#xff0c;能有效隔绝周围的嘈杂声&#xff0c;对于上班族来说&#xff0c;真的会舒服很多。市场上有很多降噪耳机可供选择&#xff0c;相比于价格上千的发烧级装备&#xff0c;我更倾向于…

【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...

NEON 通用数据处理指令包括以下指令(不限于): • DUP 将标量复制到向量的所有向量线。 • EXT 提取。 • REV16、REV32、REV64 反转向量中的元素。 • TBL、TBX 向量表查找。 • TRN 向量转置。 • UZP、ZIP 向量交叉存取和反向交叉存取。 1 DUP (element) 将…

postman连接mysql报ETIMEDOUT错误解决方法

问题 在cmd中执行xmysql -h localhost -u username -p password -d database命令后,报errorno: ETIMEDOUT’超时错误; 解决方法 给执行命令加上端口信息 -o post: xmysql -h localhost -u username -p password -d database -o port

数据集成实现以及平台安装部署入门

ETLCloud是什么?** ETLCloud是一个提供了一套工具和服务的数据集成平台&#xff0c;用于将数据从不同的来源抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;到目标系统中。ETL代表了这个过程的三个主要步骤。…

【Java】文件操作和IO

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 文件概念文件的分类常见的文件类型文件系统的目录结构路径 Java中的文件操作文件系统相关操作绝…

【Linux】多路IO复用技术①——select详解如何使用select模型在本地主机实现简易的一对多服务器(附图解与代码实现)

这一篇的篇幅可能有点长&#xff0c;但真心希望大家能够静下心来看完&#xff0c;相信一定会有不小的收获。那么话不多说&#xff0c;我们这就开始啦&#xff01;&#xff01;&#xff01; 目录 一对一服务器中的BUG 如何实现简易的一对多服务器 实现简易一对多服务器的大体…

前端css介绍

CSS介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 CSS语法 CSS实例 每个CSS样式由两个组成部分&#xff1a;选择器和…

使用Qt Installer Framework将自己的程序打包成安装包程序

使用Qt Installer Framework将自己的程序打包成安装包程序 制作安装包程序就是将自己的程序打包成一个可执行的exe&#xff0c;双击之后进行安装。 1. 在制作安装包程序之前需要安装qt官方提供的安装包制作工具Qt Installer Framework 去qt官方网址&#xff0c;下载对应的 Q…

HNU-计算机网络-实验1-应用协议与数据包分析实验(Wireshark)

计算机网络 课程基础实验一 应用协议与数据包分析实验(Wireshark) 计科210X 甘晴void 202108010XXX 一、实验目的&#xff1a; 通过本实验&#xff0c;熟练掌握Wireshark的操作和使用&#xff0c;学习对HTTP协议进行分析。 二、实验内容 2.1 HTTP 协议简介 HTTP 是超文本…