题目
给定一个二叉树的根 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, 10^4]
范围内 - 树的深度在
[1, 10^4]
范围内 -100 <= Node.val <= 100
-10^5 <= val <= 10^5
1 <= depth <= the depth of tree + 1
解题
方法一:DFS
思路
类似层序遍历,深搜到 depth - 1
层加子节点。
注意:左右子树允许是空树。
-
测试用例:30 / 109
-
[1,2,3,4] 5 4
代码
class Solution {
int val, depth;
void dfs(TreeNode* node, int level) {
if (!node) return;
if (level == depth - 1) {
node->left = new TreeNode(val, node->left, nullptr);
node->right = new TreeNode(val, nullptr, node->right);
++level;
} else {
dfs(node->left, level + 1);
dfs(node->right, level + 1);
}
}
public:
TreeNode* addOneRow(TreeNode* root, int _val, int _depth) {
val = _val, depth = _depth;
if (depth == 1) {
return new TreeNode(val, root, nullptr);
}
dfs(root, 1);
return root;
}
};
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int val, int depth) {
if (root == nullptr) return root;
switch (depth) {
case 1:
return new TreeNode(val, root, nullptr);
case 2:
root->left = new TreeNode(val, root->left, nullptr);
root->right = new TreeNode(val, nullptr, root->right);
break;
default:
root->left = addOneRow(root->left, val, depth - 1);
root->right = addOneRow(root->right, val, depth - 1);
}
return root;
}
};
class Solution {
public TreeNode addOneRow(TreeNode root, int val, int depth) {
if (root == null) return root;
switch (depth) {
case 1:
return new TreeNode(val, root, null);
case 2:
root.left = new TreeNode(val, root.left, null);
root.right = new TreeNode(val, null, root.right);
break;
default:
root.left = addOneRow(root.left, val, depth - 1);
root.right = addOneRow(root.right, val, depth - 1);
}
return root;
}
}
评论区