携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 节点数在 [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)
根据以上思路,我们使用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右子树;
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提交记录如下:
- 时间复杂度:O(n),n为二叉树节点
- 空间复杂度:O(n),n为二叉树存储节点
以上是本期内容,欢迎大佬们点赞评论,下期见~~