题目描述
给定一个二叉树的根结点,一个值 v
和 深度 d
,你需要在第 d
层添加一行值为 v
的结点。根结点在第 1 层。
添加规则如下:给定一个正整数深度值 d
,对于深度为 d-1
层的每一非空节点 N
,创建 N
的两个值为 v
的左子结点和右子结点。将 N
原先的左子树,连接为新结点 v 的左子树;将 N
原先的右子树,连接为新结点 v
的右子树。如果 d
的值为 1,则深度 d - 1 不存在,那么创建一个新的根结点 v
,原先的整棵树将作为 v
的左子树。
样例
输入:
二叉树如下所示:
4
/ \
2 6
/ \ /
3 1 5
v = 1
d = 2
输出:
4
/ \
1 1
/ \
2 6
/ \ /
3 1 5
输入:
二叉树如下所示:
4
/
2
/ \
3 1
v = 1
d = 3
输出:
4
/
2
/ \
1 1
/ \
3 1
注意
- 输入的深度值 d 的范围是:[1,二叉树最大深度 + 1]。
- 输入的二叉树至少有一个结点。
算法
(递归,模拟) $O(n)$
- 若 d 为 1,则直接按照题目描述做即可。
- 否则,从根结点开始遍历,到 d - 1 层时,新创建两个结点,并初始化结点值,左右儿子为当前遍历结点的左右儿子。
时间复杂度
- 每个结点最多遍历一次,故时间复杂度为 $O(n)$。
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void dfs(TreeNode *r, int cur_d, int v, int d) {
if (r == NULL)
return;
if (cur_d == d - 1) {
TreeNode *new_left = new TreeNode(v);
TreeNode *new_right = new TreeNode(v);
new_left -> left = r -> left;
new_right -> right = r -> right;
r -> left = new_left;
r -> right = new_right;
return;
}
dfs(r -> left, cur_d + 1, v, d);
dfs(r -> right, cur_d + 1, v, d);
}
TreeNode* addOneRow(TreeNode* root, int v, int d) {
if (d == 1) {
TreeNode *new_root = new TreeNode(v);
new_root -> left = root;
return new_root;
}
dfs(root, 1, v, d);
return root;
}
};