|
| 1 | +# [0623. 在二叉树中增加一行](https://leetcode.cn/problems/add-one-row-to-tree/) |
| 2 | + |
| 3 | +- 标签:树、深度优先搜索、广度优先搜索、二叉树 |
| 4 | +- 难度:中等 |
| 5 | + |
| 6 | +## 题目链接 |
| 7 | + |
| 8 | +- [0623. 在二叉树中增加一行 - 力扣](https://leetcode.cn/problems/add-one-row-to-tree/) |
| 9 | + |
| 10 | +## 题目大意 |
| 11 | + |
| 12 | +**描述**: |
| 13 | + |
| 14 | +给定一个二叉树的根 $root$ 和两个整数 $val$ 和 $depth$。 |
| 15 | + |
| 16 | +**要求**: |
| 17 | + |
| 18 | +在给定的深度 $depth$ 处添加一个值为 $val$ 的节点行。 |
| 19 | + |
| 20 | +注意,根节点 $root$ 位于深度 1。 |
| 21 | + |
| 22 | +**说明**: |
| 23 | + |
| 24 | +- 加法规则如下: |
| 25 | + - 给定整数 $depth$,对于深度为 $depth - 1$ 的每个非空树节点 $cur$ ,创建两个值为 $val$ 的树节点作为 $cur$ 的左子树根和右子树根。 |
| 26 | + - $cur$ 原来的左子树应该是新的左子树根的左子树。 |
| 27 | + - $cur$ 原来的右子树应该是新的右子树根的右子树。 |
| 28 | + - 如果 $depth == 1$ 意味着 $depth - 1$ 根本没有深度,那么创建一个树节点,值 $val$ 作为整个原始树的新根,而原始树就是新根的左子树。 |
| 29 | +- 节点数在 $[1, 10^{4}]$ 范围内。 |
| 30 | +- 树的深度在 $[1, 10^{4}]$ 范围内。 |
| 31 | +- $-10^{3} \le Node.val \le 10^{3}$。 |
| 32 | +- $-10^{5} \le val \le 10^{5}$。 |
| 33 | +- $1 \le depth \le the depth of tree + 1$。 |
| 34 | + |
| 35 | +**示例**: |
| 36 | + |
| 37 | +- 示例 1: |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +```python |
| 42 | +输入: root = [4,2,6,3,1,5], val = 1, depth = 2 |
| 43 | +输出: [4,1,1,2,null,null,6,3,1,5] |
| 44 | +``` |
| 45 | + |
| 46 | +- 示例 2: |
| 47 | + |
| 48 | + |
| 49 | + |
| 50 | +```python |
| 51 | +输入: root = [4,2,null,3,1], val = 1, depth = 3 |
| 52 | +输出: [4,2,null,1,1,3,null,null,1] |
| 53 | +``` |
| 54 | + |
| 55 | +## 解题思路 |
| 56 | + |
| 57 | +### 思路 1:广度优先搜索 |
| 58 | + |
| 59 | +#### 思路 1:算法描述 |
| 60 | + |
| 61 | +这道题目要求在二叉树的指定深度 $depth$ 处添加一行值为 $val$ 的节点。 |
| 62 | + |
| 63 | +我们可以使用广度优先搜索(BFS)来找到深度为 $depth - 1$ 的所有节点,然后为这些节点添加新的左右子节点。 |
| 64 | + |
| 65 | +特殊情况:如果 $depth = 1$,则需要创建一个新的根节点,原来的树作为新根节点的左子树。 |
| 66 | + |
| 67 | +具体步骤如下: |
| 68 | + |
| 69 | +1. 如果 $depth = 1$,创建一个新的根节点,值为 $val$,原来的根节点作为新根节点的左子节点,返回新根节点。 |
| 70 | +2. 使用 BFS 遍历二叉树,找到深度为 $depth - 1$ 的所有节点。 |
| 71 | +3. 对于深度为 $depth - 1$ 的每个节点 $node$: |
| 72 | + - 创建两个新节点 $left\_node$ 和 $right\_node$,值都为 $val$。 |
| 73 | + - 将 $node$ 的原左子节点作为 $left\_node$ 的左子节点。 |
| 74 | + - 将 $node$ 的原右子节点作为 $right\_node$ 的右子节点。 |
| 75 | + - 将 $left\_node$ 和 $right\_node$ 分别设置为 $node$ 的左右子节点。 |
| 76 | +4. 返回根节点。 |
| 77 | + |
| 78 | +#### 思路 1:代码 |
| 79 | + |
| 80 | +```python |
| 81 | +# Definition for a binary tree node. |
| 82 | +# class TreeNode: |
| 83 | +# def __init__(self, val=0, left=None, right=None): |
| 84 | +# self.val = val |
| 85 | +# self.left = left |
| 86 | +# self.right = right |
| 87 | +class Solution: |
| 88 | + def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]: |
| 89 | + # 特殊情况:在根节点前添加一行 |
| 90 | + if depth == 1: |
| 91 | + new_root = TreeNode(val) |
| 92 | + new_root.left = root |
| 93 | + return new_root |
| 94 | + |
| 95 | + # 使用 BFS 找到深度为 depth - 1 的所有节点 |
| 96 | + queue = [root] |
| 97 | + current_depth = 1 |
| 98 | + |
| 99 | + while queue and current_depth < depth - 1: |
| 100 | + size = len(queue) |
| 101 | + for _ in range(size): |
| 102 | + node = queue.pop(0) |
| 103 | + if node.left: |
| 104 | + queue.append(node.left) |
| 105 | + if node.right: |
| 106 | + queue.append(node.right) |
| 107 | + current_depth += 1 |
| 108 | + |
| 109 | + # 为深度为 depth - 1 的所有节点添加新的左右子节点 |
| 110 | + for node in queue: |
| 111 | + # 创建新的左子节点 |
| 112 | + left_node = TreeNode(val) |
| 113 | + left_node.left = node.left |
| 114 | + node.left = left_node |
| 115 | + |
| 116 | + # 创建新的右子节点 |
| 117 | + right_node = TreeNode(val) |
| 118 | + right_node.right = node.right |
| 119 | + node.right = right_node |
| 120 | + |
| 121 | + return root |
| 122 | +``` |
| 123 | + |
| 124 | +#### 思路 1:复杂度分析 |
| 125 | + |
| 126 | +- **时间复杂度**:$O(n)$,其中 $n$ 是二叉树的节点数。最坏情况下需要遍历所有节点。 |
| 127 | +- **空间复杂度**:$O(n)$。队列中最多存储 $n$ 个节点。 |
0 commit comments