623. 在二叉树中增加一行
中等
给定一个二叉树的根 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]
题解(层序遍历+队列 求解)
因为在深度为2是添加一行就是在第二行与第一行之间添加一行节点,所以初始化一个变量为 1,记录要添加一行位置与终止循环条件
当添加的一行的左右节点为空时,且深度正好为要添加一行深度,则让该节点的左右节点都为要添加的节点
当要添加的节点左或右不为空,借助中间节点拼接树
当深度为1时让要添加的节点左子树为根节点即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode addOneRow(TreeNode root, int val, int depth) {
Queue<TreeNode> queue = new LinkedList<>();
if(depth == 1){
TreeNode temp = new TreeNode(val);
temp.left = root;
System.out.println(temp.val+" "+temp.left.val);
return temp;
}
// TreeNode temp = new TreeNode(val);
TreeNode dummy = root;
queue.add(dummy);
int count = 1;
while (queue.size() > 0){
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode remove = queue.remove();
if(remove.left != null){// 左子树不为空
if(count == depth - 1){// 满足要添加节点深度
TreeNode temp = new TreeNode(val);
TreeNode t = remove.left;// 中间节点拼接
remove.left = temp;
temp.left = t;
}else {// 不满足节点深度继续添加下一层节点
queue.add(remove.left);
}
}else if(count == depth - 1){// 左子树为空且满足添加节点深度,直接让添加节点为该节点左子树
TreeNode temp = new TreeNode(val);
remove.left = temp;
}
if(remove.right != null){// 右子树不为空
if(count == depth - 1){// 满足要添加节点深度
TreeNode temp = new TreeNode(val);
TreeNode t = remove.right;// 中间节点拼接
remove.right = temp;
temp.right = t;
}else {// 不满足节点深度继续添加下一层节点
queue.add(remove.right);
}
}else if(count == depth - 1){// 左子树为空且满足添加节点深度,直接让添加节点为该节点左子树
TreeNode temp = new TreeNode(val);
remove.right = temp;
}
}
// if(count == depth){
// break;
//}
count++;
}
return dummy;
}
}