携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
题目描述
给定一个二叉树的根 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, 104] 范围内
- 树的深度在 [1, 104]范围内
- -100 <= Node.val <= 100
- -105 <= val <= 105
- 1 <= depth <= the depth of tree + 1
题目元素
- 给定一个二叉树root,正整数val和depth。
- 在二叉树的depth深度,在depth-1的左右叶子节点上添加值为val的左右叶子节点,将原本的depth深度的节点按照原来的顺序放在新家的节点上。
解题思路
这个题有点类似leetcode1161,都是需要操作整层的节点。所以解题思路也相似,难点都在怎么获取到一层的节点。
-
深度优先
从二叉树根节点开始分别对左右叶子节点进行遍历,用数字num记录当前层数,当当前层数等于depth-1时,放入数组中。然后继续遍历
-
广度优先
将一层的所有叶子节点放到一个数组中,一层遍历完了之后继续遍历下一层。当层数等于depth-1时,则将当前所有节点放入数组即所求层的所有节点。 获取到depth-1层的所有节点后,根据原来的左右叶子节点存在结构,创建新的叶子节点,将值设置为val,左右叶子节点将原来的depth层的左右叶子节点按照原来的顺序放上去。
代码实现
/**
* @param root
* @param val
* @param depth
* @return
*/
public static TreeNode addOneRow(TreeNode root, int val, int depth) {
// 如果root为空,或者depth为0,则直接返回
if (root == null || depth == 0) {
return root;
}
// 如果depth==1,直接将val作为新根,原二叉树变成左节点
if (depth == 1) {
return new TreeNode(val,root,null);
}
TreeNode res = new TreeNode();
// 当前循环的所有节点
List<TreeNode> loopNodes = new ArrayList<>();
loopNodes.add(root);
// depth-1层的节点
List<TreeNode> currNodes = loopEndDepth(loopNodes, depth, 1);
for (int i =0;i < currNodes.size();i++) {
TreeNode treeNode = currNodes.get(i);
TreeNode left = treeNode.left;
TreeNode right = treeNode.right;
treeNode.left = new TreeNode(val, left, null);
treeNode.right = new TreeNode(val, null, right);
}
return root;
}
private static List<TreeNode> loopEndDepth(List<TreeNode> loopNodes, int depth, int currLevel ) {
// 重新创建下一层的元素进行遍历
List<TreeNode> nextNodes = new ArrayList<>();
List<TreeNode> currNodes = new ArrayList<>();
for (int i = 0;i < loopNodes.size();i ++) {
TreeNode treeNode = loopNodes.get(i);
if (currLevel == depth -1) {
// 目标节点
currNodes.add(treeNode);
}else {
if (treeNode.left != null) {
nextNodes.add(treeNode.left);
}
if (treeNode.right != null) {
nextNodes.add(treeNode.right);
}
}
}
return currNodes.size() > 0 ? currNodes : loopEndDepth(nextNodes,depth,currLevel+1);
}
复制代码