题目地址:
https://leetcode.com/problems/add-one-row-to-tree/
给定一棵二叉树,要求在深度为 d d d的地方增加一层数值为 v v v的节点。题目保证树非空,并且 d d d是有效的。树根的深度定义为 1 1 1。如果 d = 1 d=1 d=1,就把原树作为左子树接到新节点上。
DFS的做法可以参考https://blog.csdn.net/qq_46105170/article/details/108481022。此处也可以用BFS来做。遍历到深度是 d − 1 d-1 d−1的节点的时候,就把值为 v v v的节点new出来,然后接在中间。整个一层接完之后要及时退出循环(这个细节不能忽略,否则BFS会继续遍历导致错误)。代码如下:
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public TreeNode addOneRow(TreeNode root, int v, int d) {
if (d == 1) {
TreeNode newRoot = new TreeNode(v);
newRoot.left = root;
return newRoot;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int depth = 1;
while (!queue.isEmpty()) {
// 算一下下一层的深度(不是queue里存的节点深度,是下一层)
depth++;
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode cur = queue.poll();
// 当下一层是d的时候,就new出新的节点接上去
if (depth == d) {
TreeNode left = cur.left, right = cur.right;
cur.left = new TreeNode(v);
cur.left.left = left;
cur.right = new TreeNode(v);
cur.right.right = right;
}
// 将下一层入队
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
// 如果已经增加好了,就及时退出循环
if (depth == d) {
break;
}
}
return root;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时空复杂度 O ( n ) O(n) O(n)。