【LeetCode】623. 在二叉树中增加一行

image.png

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

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

二、思路分析:

今天的每日一题又是一题关于二叉树,我们来读取题目内容,要求在指定的深度中新增一行,那新增的规则具体是怎么样的,我们继续审题了解:

  • 当指定的depth为1时,新的val节点作为新的root节点,原先的根节点作为左节点
  • 当指定的depth时,则在depth-1出非空cur节点添加两个val组建的新节点
    • cur 原来的左子树应该是新的左子树根的左子树。
    • cur 原来的右子树应该是新的右子树根的右子树。

题目给出的树是二叉树,且二叉树的高度从1开始算起。一般二叉树涉及的遍历查找,我们都可以使用深度优先遍历和广度优先遍历的思想来解决。

  • 深度优先遍历:通常使用递归方法实现
  • 广度优先遍历:通常使用队列方法实现

方法一:深度优先遍历

因此,本题同样可以使用这两种方法来解答,对于深度优先遍历来说,我们只需要找四种条件即可:

  • 当root为空时,即退出递归遍历
  • 当depth为1时,直接构建一个新节点TreeNode,把原先的节点拼接在新节点的左子树上
  • 当depth为2时,原先的节点cur创建两个val新节点,并val左节点拼接cur.left为其左子树,val右节点拼接cur.right为其右子树
  • depth为其他值时,继续递归调用self.addOneRow(),root左节点赋值为self.addOneRow(root.left,val,depth-1),root右节点赋值为self.addOneRow(root.right,val,depth-1) 流程图.jpg 根据以上思路,我们使用Python可以快速实现,代码如下:
    class Solution(object):
        def addOneRow(self, root, val, depth):
            """
            :type root: TreeNode
            :type val: int
            :type depth: int
            :rtype: TreeNode
            """
    
            if not root:return
            if depth == 1:
                return TreeNode(val,root,None)
            if depth == 2:
                root.left = TreeNode(val,root.left,None)
                root.right = TreeNode(val,None,root.right)
            else:
                root.left = self.addOneRow(root.left,val,depth-1)
                root.right = self.addOneRow(root.right,val,depth-1)
            return root
    
    复制代码

方法二:广度优先遍历

  • bfs算法是一层遍历完再遍历下一层,因此我们需要找到指定depth的cur节点depth-2的所有节点
  • 定义一个以root为节点的bfs数组,在(1,depth-1)层中获取到cur节点列表tmp,赋值给bfs
  • 再使用for循环遍历获取到的bfs列表中所有节点,cur.left添加新节点val,并将cur左子树作为val左子树;cur.right添加新节点val,并将cur右子树作为val右子树; 流程图 (1).jpg
     class Solution(object):
         def addOneRow(self, root, val, depth):
             """
             :type root: TreeNode
             :type val: int
             :type depth: int
             :rtype: TreeNode
             """
             if depth == 1:
                 return TreeNode(val,root,None)
    
             bfs = [root]
             for i in range(1,depth-1):
                 tmp = []
                 for node in bfs:
                     if node.left:
                         tmp.append(node.left)
                     if node.right:
                         tmp.append(node.right)
                 bfs = tmp
    
             for node in bfs:
                 node.left = TreeNode(val,node.left,None)
                 node.right = TreeNode(val,None,node.right)
             return root
    
    复制代码

三、总结:

本题仍然是考察我们对二叉树两种遍历方法使用思路,对于二叉树问题我们还需要大量练习才能熟能生巧,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为二叉树节点
  • 空间复杂度:O(n),n为二叉树存储节点

以上是本期内容,欢迎大佬们点赞评论,下期见~~

猜你喜欢

转载自juejin.im/post/7128379358003068958