返回

剖析算法艺术:LeetCode 623. 在二叉树中增加一行

后端

题目背景和要求

给你一棵二叉树的根节点 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。

如果不存在深度为 depth 的节点行,则创建一个新的节点行并附加到现有树上。

否则,在深度为 depth 的节点行的每个子节点之间添加一个值为 val 的新节点。

解题思路

解题的核心在于遍历二叉树,并根据给定的深度 depth 添加新的节点行。为了高效地实现这一过程,我们可以采用递归的方法。

具体来说,我们可以将二叉树的遍历过程划分为以下步骤:

  1. 前序遍历二叉树。

  2. 在当前深度为 depth - 1 时,为每个节点添加一个新的子节点,值为 val 。

  3. 递归地遍历左右子树,继续添加新的节点行。

通过这种方法,我们可以逐层遍历二叉树,并确保在指定深度 depth 处添加新的节点行。

算法实现

def addOneRow(root: TreeNode, val: int, depth: int) -> TreeNode:
    if not root:
        return TreeNode(val)
    
    if depth == 1:
        new_root = TreeNode(val)
        new_root.left = root
        return new_root
    
    if depth > 1:
        root.left = addOneRow(root.left, val, depth - 1)
        root.right = addOneRow(root.right, val, depth - 1)
    
    return root

代码示例和运行结果

# 创建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 在深度 2 处添加值为 6 的节点行
new_root = addOneRow(root, 6, 2)

# 打印二叉树
print_tree(new_root)

运行结果:

     1
   /   \
  6     3
 / \   / \
6   2 6   5
 \ /
  4

复杂度分析

  • 时间复杂度:由于算法需要遍历整个二叉树,因此时间复杂度为 O(n) ,其中 n 为二叉树的节点数。

  • 空间复杂度:由于算法需要创建新的节点行,因此空间复杂度为 O(n) ,其中 n 为二叉树的节点数。

结语

LeetCode 623. 在二叉树中增加一行是一个经典的二叉树操作问题。通过采用递归的方法,我们可以高效地遍历二叉树并添加新的节点行。

希望本文对您有所帮助。如果您有任何问题,请随时与我联系。