一、题目

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

注意,根节点 root 位于深度 1 。

加法规则如下:

  • 给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
  • cur 原来的左子树应该是新的左子树根的左子树。
  • cur 原来的右子树应该是新的右子树根的右子树。
  • 如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。

二、示例

2.1> 示例 1:

【输入】 root = [4,2,6,3,1,5], val = 1, depth = 2
【输出】 [4,1,1,2,null,null,6,3,1,5]

2.2> 示例 2:

【输入】 root = [4,2,null,3,1], val = 1, depth = 3
【输出】 [4,2,null,1,1,3,null,null,1]

提示:

  • 节点数在 [1, 104] 范围内
  • 树的深度在 [1, 104]范围内
  • -100 <= Node.val <= 100
  • -105 <= val <= 105
  • 1 <= depth <= the depth of tree + 1

三、解题思路

3.1> 思路1:广度优先算法

根据题意,我们要在指定的某一层depth中添加一行指定的val值节点,那么很容易想到的解题思路就是广度优先算法。通过广度优先算法+队列,我们可以确定当前所遍历的层数,因为题意是要在depth层中添加一行val节点,其实主要修改节点之间的关系是在depth-1这一层中,所以,当我们遍历到depth-1这层的是,执行新节点的创建并维护到depth-1这层节点即可。

当然,在这个过程中,我们还需要针对一些特殊情况做特殊的处理,比如depth如果传值为1,那么意思就是,新的节点要替换老的root节点了。此时我们只需要在创建的新节点的左子节点维护原root节点即可。那么,另一种情况就是,当depth值时大于1的情况下,那么这种情况就可以使用通用的算法逻辑去处理了。依然是首先将root节点放入到队列Queue中,此时队列size等于1,那么我们通过for循环遍历这个size长度的节点,每当从队列中取到节点之后,都要再向Queue中放入自己的左右子节点,当然,如果左节点或者右节点有一个为null的话,就不用放入到Queue中了

那么,每当遍历完一层节点之后,层数都要加1,当我们发现,当前遍历的层数等于depth-1的话,那么,就可以开始执行新建节点操作了

下面我们以root = [4,2,6,3,1,5],val = 1,depth = 3为例。首先,将root节点放入到队列Queue中,此时元素size=1,通过poll()方法遍历每个元素,由于此时层级是1,不满足depth-1,所以不需要创建新节点。具体操作如下所示:

随着我们对Node(4)的遍历,随着我们将其子节点Node(2)和Node(6)也放入到队列Queue中,此时队列 size=2,通过poll()方法遍历每个元素。

由于此时层级是2,满足了depth-1的条件,那么我们开始着手创建新的节点。根据题意,val值等于1,所以我们分别为Node(2)和Node(6)创建一共4个Node(1),区别在于,这四个Node(1)的左右子节点是不同的,即:其中一个Node(1)的左子节点是Node(3);另一个Node(1)的右子节点是Node(1);第三个Node(1)的左子节点是Node(5);最后一个Node(1)的左右子节点都为null。具体操作如下图所示:

通过对depth-1这层节点的操作,也就完成了我们整个业务逻辑了,我们将根节点进行返回即可。具体的代码实现,请参照:4.1> 实现1:广度优先算法

3.2> 思路2:深度优先算法

除了可以采用广度优先算法之外,我们也可以采用深度优先算法。那么当深度遍历到达depth-1这层的时候,我们就开始进行新节点的创建。此处与广度优先算法的区别就是,我们不再需要Queue这个队列结构了,而是通过对depth的计算,来确定是否到达了我们要操作的那一层。怎么计算呢?这里面其实会有一些绕。因为深度优先是从root根节点向下遍历的。而入参depth我们获得之后,要通过每次的减1操作,来计算是否满足我们要操作的那一层。他们之间别扭的点就在于,一个是从上往下,另一个是从下往上。那么问题来了,depth要减到什么情况下,才说明到达了我们要操作的那一层呢。其实是这样的:首先我们要操作的那层其实就是depth - 1这层。那么如果从根节点到达这层是需要往下走 (depth) - 1 - 1 = depth - 2 次 ,那么随着每次遍历,depth都会执行减1操作,也就是说,当depth - (depth - 2) = 2的时候,就到达了我们期望要操作的那一层了。即:if (depth == 2) 执行创建新节点的操作

通过深度优先算法,可以全面提高代码执行效率和降低内存消耗。具体的代码实现,请参照:4.2> 实现2:深度优先算法

四、代码实现

4.1> 实现1:广度优先算法

class Solution {public TreeNode addOneRow(TreeNode root, int val, int depth) {if (depth == 1) {return new TreeNode(val, root, null);}Queue<TreeNode> queue = new ArrayDeque();queue.add(root);int searchDepth = 1;while(!queue.isEmpty() && searchDepth != depth) {// 因为下面else中会向queue中添加元素,所以,此处应该先计算出来循环的size大小,以免受到影响int levelNodeSize = queue.size();for (int i = 0; i < levelNodeSize; i++) {TreeNode node = queue.poll();if (searchDepth == (depth - 1)) {node.left = new TreeNode(val, node.left, null);node.right = new TreeNode(val, null, node.right);} else {if (node.left != null) queue.add(node.left);if (node.right != null) queue.add(node.right);}}searchDepth++;}return root;}
}

4.2> 实现2:深度优先算法

class Solution {public TreeNode addOneRow(TreeNode root, int val, int depth) {if (root == null) return null;if (depth == 1) return new TreeNode(val, root, null);if (depth == 2) {root.left = new TreeNode(val, root.left, null);root.right = new TreeNode(val, null, root.right);} else {addOneRow(root.left, val, depth - 1);addOneRow(root.right, val, depth - 1);}return root;}
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

图解LeetCode——623. 在二叉树中增加一行(难度:中等)相关推荐

  1. Java实现 LeetCode 623 在二叉树中增加一行(遍历树)

    623. 在二叉树中增加一行 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N, ...

  2. LeetCode 623. 在二叉树中增加一行(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整 ...

  3. LeetCode——623.在二叉树中增加一行

    通过万岁!!! 题目:给你一个二叉树,然后在他的第depth层上面插入一层.插入的值是val,并且之前的左子树,还是这个插入节点的左子树,之前的右子树还是这个插入节点的右子树. 思路:层序遍历,如果到 ...

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

    给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N,为 N 创建两个值为 v 的左 ...

  5. 20200210:(leetcode 623)在二叉树中增加一行

    在二叉树中增加一行 题目 算法与思路 代码实现 复杂度分析 题目 算法与思路 本题的思路在题目中已经为我们全部说明了,下面再列一遍就可以了 给定一个深度值 d (正整数),针对深度为 d-1 层的每一 ...

  6. ​LeetCode刷题实战623:在二叉树中增加一行

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  7. 青铜三人行之在二叉树中增加一行

    先说一个消息,为了方便互相交流学习,青铜三人行建了个微信群,感兴趣的伙伴可以扫码加下面的小助手抱你入群哦! 每周一题,代码无敌~这周「青铜三人行」带了一个二叉树的问题: 在二叉树中增加一行 青铜三人行 ...

  8. 图解LeetCode——1184. 公交站间的距离(难度:简单)

    一.题目 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号.我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站 ...

  9. LeetCode实战:二叉树中的最大路径和

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a non ...

最新文章

  1. ssh,FTP到远程服务器时,显示自定义的警告信息
  2. Machine Learning:如何选择机器学习算法?
  3. 在 ASP.NET Core 中集成 Skywalking APM
  4. fastapi日志重复打印_【FastAPI】踩坑总结
  5. piwik抓取用户交互行为
  6. mariadb忘记密码修改密码
  7. Oracle数据库中IN参数个数超过1000的问题
  8. leetcode python3 简单题141. Linked List Cycle
  9. 深入理解JavaScript内部原理(5): function
  10. 查看微信公众号文章发布时间
  11. Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足
  12. c++中按位取反运算
  13. php时间戳 中文,PHP时间戳-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  14. 计算机修改人类记忆曲线,遗忘曲线——揭秘人类记忆存储的奥秘
  15. 备案注销申请表_注销备案申请表
  16. 代码优化就一个原则-消除冗余
  17. Linux下用ls命令查看文件以及文件夹个数
  18. java大顶堆小顶堆使用案例
  19. CSS中过渡效果(transition)
  20. terminal is not fully functional

热门文章

  1. Binding表达式虽然同是mode two way写的位置不同效果不同
  2. 核酸检测多少人为一组混检合适?
  3. 半并行深度神经网络(SPDNN)混合架构,首次应用于单目相机的深度
  4. 超前点播修改了,网站视频信息采集
  5. 营销策略策划的方法汇总(下)
  6. 破解WIFI的一些参数说明
  7. [RK3288][Android6.0] WiFi之开机自动连接过程
  8. The label does not denote a loop in forEach
  9. SAP物料移动类型和自动科目设置
  10. 乐学云课堂App开发——绪论