当前位置: 首页 > news >正文

【LeetCode每日一题】——623.在二叉树中增加一行

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 广度优先遍历

二【题目难度】

  • 中等

三【题目编号】

  • 623.在二叉树中增加一行

四【题目描述】

  • 给定一个二叉树的根 root 和两个整数 valdepth ,在给定的深度 depth 处添加一个值为 val 的节点行。
  • 注意,根节点 root 位于深度 1
  • 加法规则如下:
    • 给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
    • cur 原来的左子树应该是新的左子树根的左子树。
    • cur 原来的右子树应该是新的右子树根的右子树。
    • 如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。

五【题目示例】

  • 示例 1:
    在这里插入图片描述

    • 输入: root = [4,2,6,3,1,5], val = 1, depth = 2
    • 输出: [4,1,1,2,null,null,6,3,1,5]
  • 示例 2:
    在这里插入图片描述

    • 输入: root = [4,2,null,3,1], val = 1, depth = 3
    • 输出: [4,2,null,1,1,3,null,null,1]

六【题目提示】

  • 节点数在 [ 1 , 1 0 4 ] 范围内 节点数在 [1, 10^4] 范围内 节点数在[1,104]范围内
  • 树的深度在 [ 1 , 1 0 4 ] 范围内 树的深度在 [1, 10^4]范围内 树的深度在[1,104]范围内
  • − 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100
  • − 1 0 5 < = v a l < = 1 0 5 -10^5 <= val <= 10^5 105<=val<=105
  • 1 < = d e p t h < = t h e d e p t h o f t r e e + 1 1 <= depth <= the\ depth\ of\ tree\ + 1 1<=depth<=the depth of tree +1

七【解题思路】

  • 这道题还是比较简单的,就是对于二叉树的层数遍历的一种变种
  • 我们只需要找到待插入行的上一行,然后将目标行插入即可
  • 寻找待插入行的上一行的这个过程,可以使用广度优先搜索
  • 具体细节可以查看下面的代码

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n) n n n为传入的二叉树的节点个数
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的二叉树的节点个数

九【代码实现】

  1. Java语言版
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode addOneRow(TreeNode root, int val, int depth) {// 边界条件if (depth == 1) {return new TreeNode(val, root, null);}// 保存当前层节点List<TreeNode> curLevel = new ArrayList<TreeNode>();curLevel.add(root);// 使用广度优先搜索要插入行的上一行for (int i = 1; i < depth - 1; i++) {List<TreeNode> temp = new ArrayList<TreeNode>();for (TreeNode node : curLevel) {if (node.left != null) {temp.add(node.left);}if (node.right != null) {temp.add(node.right);}}curLevel = temp;}// 插入目标行for (TreeNode node : curLevel) {node.left = new TreeNode(val, node.left, null);node.right = new TreeNode(val, null, node.right);}// 返回结果return root;}
}
  1. Python语言版
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]:# 边界条件if root == None:returnif depth == 1:return TreeNode(val, root, None)# 保存当前层节点cur_level = [root]# 使用广度优先搜索要插入行的上一行for _ in range(1, depth - 1):temp = []for node in cur_level:if node.left:temp.append(node.left)if node.right:temp.append(node.right)cur_level = temp# 插入目标行for node in cur_level:node.left = TreeNode(val, node.left, None)node.right = TreeNode(val, None, node.right)# 返回结果return root
  1. C语言版
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* addOneRow(struct TreeNode* root, int val, int depth)
{// 边界条件if (root == NULL){struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));node->val = val;node->left = NULL;node->right = NULL;return node;}if (depth == 1){struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));node->val = val;node->left = root;node->right = NULL;return node;}// 初始化队列struct TreeNode** queue = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10001);int front = 0;int rear = 0;queue[rear++] = root;// 存储树高int level = 1;// 使用广度优先搜索算法插入目标节点while (front != rear){// 当前层节点数量int size = rear - front;// 如果找到目标行,直接插入目标节点即可if (level == depth - 1){for (int i = 0; i < size; i++){struct TreeNode* node = queue[front++];struct TreeNode* nodeLeft = (struct TreeNode*)malloc(sizeof(struct TreeNode));nodeLeft->val = val;nodeLeft->left = node->left;nodeLeft->right = NULL;node->left = nodeLeft;struct TreeNode* nodeRight = (struct TreeNode*)malloc(sizeof(struct TreeNode));nodeRight->val = val;nodeRight->left = NULL;nodeRight->right = node->right;node->right = nodeRight;}break;}// 处理当前层的节点,并将下一层的节点加入队列for (int i = 0; i < size; i++){struct TreeNode* node = queue[front++];if (node->left != NULL){queue[rear++] = node->left;}if (node->right != NULL){queue[rear++] = node->right;}}// 获取二叉树的层数level++;}// 释放内存free(queue);// 返回结果return root;}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C语言版
    在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 工厂模式和策略模式的使用策略及其优缺点比较
  • 【C#】委托/Lambda/事件
  • Python | Leetcode Python题解之第337题打家劫舍III
  • 单细胞课程01-课程简介
  • Qt题目知多少-4
  • 基于python 开发调试rabbitmq - 2
  • 鸿蒙前端开发——工具安装与项目创建
  • Vue2中watch与Vue3中watch对比
  • “论软件开发过程RUP及其应用”写作框架,软考高级,系统架构设计师
  • 使用 GPT-4 Vision 的 CLIP 嵌入来改进多模态 RAG
  • 【运维】JetBrains Gateway (Pycharm) SSH免密连接,改为免密连接
  • 【Material-UI】Floating Action Button (FAB) 详解:基础用法
  • ubuntu22.04不生成core文件
  • 结构体structure、共用体union
  • Elasticsearch中的自动补全功能详解与实践
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 08.Android之View事件问题
  • 10个确保微服务与容器安全的最佳实践
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Bootstrap JS插件Alert源码分析
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • jquery cookie
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue学习第二天
  • 精彩代码 vue.js
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 使用putty远程连接linux
  • 我看到的前端
  • 正则表达式
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​你们这样子,耽误我的工作进度怎么办?
  • #100天计划# 2013年9月29日
  • #if和#ifdef区别
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ${ }的特别功能
  • (2022 CVPR) Unbiased Teacher v2
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四)js前端开发中设计模式之工厂方法模式
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ****三次握手和四次挥手
  • .form文件_SSM框架文件上传篇
  • .Net 中Partitioner static与dynamic的性能对比
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .NET国产化改造探索(一)、VMware安装银河麒麟