LeetCode_二叉树_中等_623.在二叉树中增加一行
1.题目
给定一个二叉树的根 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-one-row-to-tree
2.思路
(1)BFS
每遍历每一层时,用变量 curDepth 来记录当前深度,当 curDepth == depth - 1 时,说明下一层为要添加节点的层,此时便进行添加操作。
(2)DFS
同理,使用 DFS 时用变量 curDepth 来记录当前深度,到达第 depth - 1 层时,进行添加操作。
3.代码实现(Java)
//思路1————BFS
/**
* 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) {
if (depth == 1) {
return new TreeNode(val, root, null);
}
//BFS
Deque<TreeNode> deque = new ArrayDeque<>();
deque.addLast(root);
int curDepth = 1;
while (!deque.isEmpty()) {
// levelSize 记录当前层的节点数量
int levelSize = deque.size();
while (levelSize > 0) {
//取出队首节点
TreeNode curNode = deque.poll();
if (curDepth == depth - 1) {
//下一层为要添加节点的层
TreeNode node1 = new TreeNode(val);
TreeNode node2 = new TreeNode(val);
node1.left = curNode.left;
node2.right = curNode.right;
curNode.left = node1;
curNode.right = node2;
} else {
if (curNode.left != null) {
deque.addLast(curNode.left);
}
if (curNode.right != null) {
deque.addLast(curNode.right);
}
}
levelSize--;
}
curDepth++;
}
return root;
}
}
//思路2————DFS
/**
* 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) {
if (depth == 1) {
return new TreeNode(val, root, null);
}
dfs(root, 1, val, depth);
return root;
}
public void dfs(TreeNode root, int curDepth, int val, int depth) {
if (root == null) {
return;
}
if (curDepth == depth - 1) {
//下一层为要添加节点的层
TreeNode node1 = new TreeNode(val);
TreeNode node2 = new TreeNode(val);
node1.left = root.left;
node2.right = root.right;
root.left = node1;
root.right = node2;
} else {
dfs(root.left, curDepth + 1, val, depth);
dfs(root.right, curDepth + 1, val, depth);
}
}
}
相关文章
- Leetcode: Insert Delete GetRandom O(1)
- 【Leetcode】107. 二叉树的层序遍历 II(中等)
- 后缀数组的应用:[Leetcode] 321.拼接最大数(困难)
- [LeetCode] Valid Sudoku
- 【LeetCode】二叉树的遍历与构建问题
- LeetCode题解——700.二叉树搜索树中的搜索
- LeetCode 103. 二叉树的锯齿形层序遍历
- 103、【树与二叉树】leetcode ——700. 二叉搜索树中的搜索:递归法+迭代法(C++版本)
- 96、【树与二叉树】leetcode ——404. 左叶子之和:递归法[先序+后序]+迭代法[先序+层次](C++版本)
- leetcode第268场周赛记录
- 【LeetCode】241. Different Ways to Add Parentheses
- 【LeetCode】224. Basic Calculator
- 【leetcode】111:二叉树的最小深度
- [LeetCode] 1282. Group the People Given the Group Size They Belong To 用户分组
- [LeetCode] 971. Flip Binary Tree To Match Preorder Traversal 翻转二叉树以匹配先序遍历
- [LeetCode] 965. Univalued Binary Tree 单值二叉树
- [LeetCode] 654. Maximum Binary Tree 最大二叉树
- [LeetCode] 298. Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
- [LeetCode] Reverse Linked List 倒置链表
- leetcode 121 Best Time to Buy and Sell Stock 买卖股票的最佳时机(简单)
- leetcode算法257.二叉树的所有路径
- leetcode算法226.翻转二叉树
- leetcode算法145.二叉树的后序遍历