【刷题日记】623. 在二叉树中增加一行

1,471 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

本次刷题日记的第 84 篇,力扣题为:623. 在二叉树中增加一行

一、题目描述:

继续今日一题,进行二叉树的修炼

二叉树的题目,其实相对还比较好做,因为咱们掌握了一定套路

二、这道题考察了什么思想?你的思路是什么?

给一棵二叉树中的某一层添加数字,题目给定了我们一些规则,我们来翻译一下:

  • 题目敲定树的 root 节点深度为 1,需要咱们在 depth 深度位置处添加一层节点值
  • 对于添加到的 depth-1 层有节点时,那么咱们以 depth-1 层的节点为父节点,创建左节点和右节点,当前左节点的左子树是原有节点的左子树,现在右节点的右子树,是原有节点的右子树
  • 当输入的 depth 等于 1 的时候,相当于,咱们当前是要创建一个根节点,且把原来的depth 为 1 的节点放到新节点的左边

分析

就这么来看,要是我们用积木来搭建的话,肯定很容易就能理解,甚至还可以玩出花来

做二叉树,用的最多的就是深度优先和广度优先来进行处理,一个使用递归,一个使用迭代,看我们乐意使用哪一种方式了

对于本题,我们可以使用深度优先的方式去进行遍历,并且我们可以将以整棵二叉树,看成一小颗一小颗的子二叉树,层级最高为 2

那么当我们需要增加的 depth 为 1 的时候,咱们就直接创建根节点即可,要是 depth 为 2,咱们就直接在根节点的上做文章

给根节点加上左子和右子,以前根节点的左子就是当前左子的左子,以前根节点的右子,就是当前右子的右子

例如这样,我们可以演示一下,例如示例 1

这个时候,我们知道,示例 1 的 depth 是 2,因此,我们都不用继续进行递归了,直接在树的第一层,也就是 depth -1 层,添加当前节点的左子和右子,然后按照逻辑调整指向即可

因此,当 depth 小于等于 2 的时候,其实我们都不需要递归,当 depth 大于 2 的时候,咱们就可以开始递归,并且可以将所有的问题,全部转成当 depth 等于 1 或者 depth 等于 2 来处理,只是处理时当前的根节点不一样而已

接下来就开始撸代码吧,我想咱们已经可以很明确的写出代码来了

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

  • 咱们重点处理 depth 等于 1 和 depth 等于 2 即可

编码如下:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func addOneRow(root *TreeNode, val int, depth int) *TreeNode {
    // 直接使用递归的方式

    if root == nil {
        return nil
    }
    if depth == 1 {
        return &TreeNode{val, root, nil}
    }
    if depth == 2 {
        root.Left = &TreeNode{val, root.Left, nil}
        root.Right = &TreeNode{val, nil, root.Right}
    } else {
        root.Left = addOneRow(root.Left, val, depth-1)
        root.Right = addOneRow(root.Right, val, depth-1)
    }
    return root

}

四、总结:

本次的这种实现方式直接是深度优先算法,直接递归,按照层级来处理 ,时间复杂度是 O(n) ,根据层级的不同,咱们遍历的深度也不同,最深的情况就是整棵树都会遍历到,则 空间复杂度也是 O(n)

原题地址:623. 在二叉树中增加一行

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~