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]
提示:
- 节点数在
[1, 104]
范围内 - 树的深度在
[1, 104]
范围内 -100 <= Node.val <= 100
-105 <= val <= 105
1 <= depth <= the depth of tree + 1
解法:递归
刷了这么多二叉树的问题,总结下来,遇到二叉树问题,一多半都是递归解法。
递归算法的思路:
(1)决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。
(2)问题的边界条件及边界值。在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。
(3)解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。把这些步骤或等式确定下来。
分析:
根据题目描述,我们可以找到三个边界条件:
(1)当树本身就为空时,那么结果一定也为空
(2)当要插入的深度是1时,及新建根节点,将之前的根节点作为新结点的左子树。
(3)当要插入的深度是2时,及给根节点新建左右两个子节点,然后再分别将之前根节点的左子树作为新建的左节点的左子树,将之前根节点的右子树作为新建的右节点的右子树。
问题递归演变:
当要插入的深度depth大于2时,意味着,先要要找到depth-1的所有结点,再给这些结点分别创建左右结点,再将之前的左右子树作为新节点的子节点,类似于上述第三个边界条件。
而树的遍历,可以使用递归算法,每遍历一次,根节点指向子节点,并让插入的深度减一,逐步使问题走向边界,当深度为2时,就达到了之前的边界三的条件,退出递归。
代码:
/**
* 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(root == null) {
return null;
}
if(depth == 1) {
return new TreeNode(val,root,null);
}
if(depth == 2) {
root.left = new TreeNode(val,root.left,null);
root.right = new TreeNode(val,null,root.right);
return root;
} else {
root.left = addOneRow(root.left,val,depth-1);
root.right = addOneRow(root.right,val,depth-1);
return root;
}
}
}
共有 0 条评论