携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
一、题目
LeetCode 在二叉树中增加一行
给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。
注意,根节点 root 位于深度 1 。
加法规则如下:
给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
cur 原来的左子树应该是新的左子树根的左子树。
cur 原来的右子树应该是新的右子树根的右子树。
如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。
示例 1:
输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]
示例 2:
输入: root = [4,2,null,3,1], val = 1, depth = 3
输出: [4,2,null,1,1,3,null,null,1]
提示:
节点数在 [1, 104] 范围内
树的深度在 [1, 104]范围内
-100 <= Node.val <= 100
-105 <= val <= 105
1 <= depth <= the depth of tree + 1
二、题解
给定有一个二叉树,需要在指定的层级中插入一层节点。
方法一
初始的root根节点为第一层,所以如果给定的层级depth是第一层的话,说明需要增加的层级就是根节点的,可以直接新建一个根节点代替原本的根节点,然后根据题目要求原本的根节点就放到新的根节点的左子树下。然后可以对二叉树节点进行深度优先搜索来遍历找到depth - 1层级,对二叉树进行递归遍历的时候需要记录当前遍历的层级,所以初始的是从根节点开始遍历的所以层级就是1,然后判断如果当前遍历到的层级是目标层级depth - 1的时候就需要在这里增加一层节点,新建一个节点把原来的左子树放到新节点的左子树下,新建一个节点把原来的右子树放到新节点的右子树下。否则的话就继续递归遍历之后的节点直到到达目标层级为止。
方法二
也可以通过BFS广度优先搜索的方式遍历二叉树节点来操作,利用队列辅助遍历,遍历每一层节点找到需要添加的地方,从给定的root数根节点开始层级遍历,遍历到目标的depth层级之后,保存目标层级的节点,最后就新建新节点添加到目标记录位置。
三、代码
方法一 Java代码
class Solution {
int val;
int depth;
public TreeNode addOneRow(TreeNode root, int val, int depth) {
if (depth == 1) {
return new TreeNode(val, root, null);
}
this.val = val;
this.depth = depth;
dfs(root, 1);
return root;
}
private void dfs(TreeNode node, int level) {
if (node == null) {
return;
}
if (depth - 1 == level) {
node.left = new TreeNode(val, node.left, null);
node.right = new TreeNode(val, null, node.right);
return;
}
dfs(node.left, level + 1);
dfs(node.right, level + 1);
}
}
时间复杂度:O(n),需要遍历一次二叉树节点。
空间复杂度:O(n),递归消耗的栈空间。