题目地址:
https://www.lintcode.com/problem/add-one-row-to-tree/description
给定一棵二叉树,要求在深度为 d d d的地方增加一层数值为 v v v的节点。题目保证树非空,并且 d d d是有效的。树根的深度定义为 1 1 1。如果 d = 1 d=1 d=1,就把原树作为左子树接到新节点上。
BFS的做法可以参考https://blog.csdn.net/qq_46105170/article/details/108481016。此处也可以用DFS做。从根节点开始深搜,当搜到 d − 1 d-1 d−1深度的时候,就开始new新节点接上去并返回。代码如下:
public class Solution {
/**
* @param root: the root of binary tree
* @param v: a integer
* @param d: a integer
* @return: return a TreeNode
*/
public TreeNode addOneRow(TreeNode root, int v, int d) {
// write your code here
if (d == 1) {
TreeNode newRoot = new TreeNode(v);
newRoot.left = root;
return newRoot;
}
dfs(root, 1, d, v);
return root;
}
private void dfs(TreeNode cur, int depth, int d, int v) {
// 遇到null了直接返回
if (cur == null) {
return;
}
// 如果走到深度d - 1的节点了,就new新节点接上去,操作完毕之后返回
if (depth == d - 1) {
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;
return;
}
// 如果没走到深度d - 1的地方,继续向下走
dfs(cur.left, depth + 1, d, v);
dfs(cur.right, depth + 1, d, v);
}
}
class TreeNode {
public int val;
public TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。