每日一题20201211(623. 在二叉树中增加一行)

简介: 在二叉树中增加一行

623. 在二叉树中增加一行


由于今日leetcode的每日一题是dota2,撸狗表示不参与了~~

3.jpg

image-20201211142539498

思路


采用广度优先遍历的方式,同时在遍历的时候记录当前深度,如果深度与d相等,那么就改变当前层次树的结构,遍历完了之后直接return root即可。

需要注意的点是,如果深度为1,则可以直接创立一个新的节点,并把root赋值给树的left节点即可。(这是一个隐藏的坑,用例可能因此跑不过)

需要注意的是,如示例1所示,插入节点后,2变成了4的left的left,6变成了4的right的right,这点需要注意一下。


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def addOneRow(self, root: TreeNode, v: int, d: int) -> TreeNode:
        # 如果d是1,则直接创立一个node,并把root赋予给node.left并返回node
        if d == 1:
            node = TreeNode(v)
            node.left = root
            return node
        # 当前深度为1
        current = 1
        deque = [root]
        # 否则开始正常的bfs
        while len(deque) > 0:
            size = len(deque)
            for i in range(size):
                node = deque.pop(0)
                left = node.left
                right = node.right
                # 因为要在深度的上一层进行修改,所以是d-1
                if current == d-1:
                    node.left = TreeNode(v)
                    node.right = TreeNode(v)
                    node.left.left = left
                    node.right.right = right
                # 开始正常的bfs
                if node.left is not None:
                    deque.append(node.left)
                if node.right is not None:
                    deque.append(node.right)
            current += 1
        return root

5.jpg

image-20201211144017079


我们还可以优化一下,因为添加完那层以后,后面的bfs可以不继续进行了,当后面的层数很深的时候,可以省下那些时间。


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def addOneRow(self, root: TreeNode, v: int, d: int) -> TreeNode:
        # 如果d是1,则直接创立一个node,并把root赋予给node.left并返回node
        if d == 1:
            node = TreeNode(v)
            node.left = root
            return node
        # 当前深度为1
        current = 1
        queue = [root]
        # 否则开始正常的bfs
        while len(queue) > 0:
            size = len(queue)
            for i in range(size):
                node = queue.pop(0)
                left = node.left
                right = node.right
                # 因为要在深度的上一层进行修改,所以是d-1
                if current == d-1:
                    node.left = TreeNode(v)
                    node.right = TreeNode(v)
                    node.left.left = left
                    node.right.right = right
                    # 添加完所有该层节点,可以直接return root了,这里用break一样
                    if i == size-1:
                        break
                # 否则开始正常的bfs
                if node.left is not None:
                    queue.append(node.left)
                if node.right is not None:
                    queue.append(node.right)
            current += 1
        return root



相关文章
|
算法
代码随想录算法训练营第二十天 | LeetCode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
代码随想录算法训练营第二十天 | LeetCode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
57 0
|
机器学习/深度学习 存储 人工智能
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
代码随想录刷题|LeetCode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
代码随想录刷题|LeetCode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
代码随想录刷题|LeetCode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
|
9月前
[leedcode]刷题有感 二叉树的深度、节点数量、与平衡二叉树2
[leedcode]刷题有感 二叉树的深度、节点数量、与平衡二叉树2
|
9月前
[leedcode]刷题有感 二叉树的深度、节点数量、与平衡二叉树1
[leedcode]刷题有感 二叉树的深度、节点数量、与平衡二叉树
|
算法 C语言 C++
|
前端开发 算法 API
[LeetCode算法]有了二叉树层序遍历,妈妈再也不用担心我不会做二叉树层级题了
博主最近在刷`leetcode`,做到二叉树套题的时候发现很多题的解题思路都是基于二叉树的层序遍历来完成的,因此写下这篇文章,记录一下二叉树层序遍历这件"神器"在实战的运用。
170 1
|
9月前
leetcode代码记录(二叉树的最小深度
leetcode代码记录(二叉树的最小深度
34 0
|
2月前
leecode刷题 二叉树最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是没有子节点的节点。如果一个子树为空,则需考虑另一子树的高度。 示例 1:输入:root = [3,9,20,null,null,15,7],输出:2。示例 2:输入:root = [2,null,3,null,4,null,5,null,6],输出:5。提示:树中节点数的范围在 [0, 105] 内,-1000 <= Node.val <= 1000。

热门文章

最新文章