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

简介: 这题的要求:根节点为深度1开始,在depth深度创建一个新的节点,把原来depth深度的节点,父节点的左子节点依旧为新节点的左子节点,右子节点依旧为新节点的右子节点。

c24ce19c2761464cbd1eebad1c1d762b.png


目链接:https://leetcode.cn/problems/add-one-row-to-tree/

思路


方法一、DFS


直接想法


这题的要求:根节点为深度1开始,在depth深度创建一个新的节点,把原来depth深度的节点,父节点的左子节点依旧为新节点的左子节点,右子节点依旧为新节点的右子节点。


这个时候我们可以用DFS从根节点开始遍历节点的左右节点,一直找到depth深度的节点,创建新的节点替换他,然后返回给父节点新的节点,对于depth深度存在问题,这里我们需要分类讨论


1.depth深度为1:需要在根节点创建新的节点,去替代根节点

2.depth深度在(1,n):这里的n是树的深度,就是在树中间插入节点,用DFS遍历递归到相应节点进行替换

3.depth深度在n:在树的叶子节点出插入新节点,不需要替换,只需要创建新的节点即可


代码示例


/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func addOneRow(root *TreeNode, val int, depth int) *TreeNode {
    var dfs func(root *TreeNode, depth int, flag int) *TreeNode
    dfs = func(root *TreeNode, depth int, flag int) *TreeNode{
        if depth == 1{
            var node *TreeNode
            if flag == 1{
                node = &TreeNode{
                    Val: val,
                    Left: root,
                    Right: nil,
                }
            }else{
                node = &TreeNode{
                    Val: val,
                    Left: nil,
                    Right: root,
                }
            }
            return node
        }
        if root == nil{
            return nil
        }
        root.Left = dfs(root.Left, depth - 1, 1)
        root.Right = dfs(root.Right, depth - 1, 0)
        return root
    }
    return dfs(root, depth, 1)
}

c2882433051b4c168bd617c9c554bcf2.png


复杂度分析


  • 时间复杂度:O(2depth - 1),表示遍历到深度为depth需要访问的节点数,这里计算的是在depth深度是满二叉树的情况下


  • 空间复杂度:O(2depth-1),表示在深度为depth需要创建的新的节点数为2depth-1个新TreeNode
目录
相关文章
|
1月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
19 2
|
1月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
15 2
|
1月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
15 2
|
1月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
18 0
|
1月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
14 0
|
1月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
16 0
|
1月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
12 0
|
1月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
16 0
|
3月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
3月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历