623. 在二叉树中增加一行(难度:中等)

题目链接:https://leetcode.cn/problems/add-one-row-to-tree/

问题描述:

给定一个二叉树的根 root 和两个整数 valdepth ,在给定的深度 depth 处添加一个值为 val 的节点行。

注意,根节点 root 位于深度 1

加法规则如下:

  • 给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
  • cur 原来的左子树应该是新的左子树根的左子树。
  • cur 原来的右子树应该是新的右子树根的右子树。
  • 如果 depth == 1意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val作为整个原始树的新根,而原始树就是新根的左子树。

示例 1:

image.png
输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]

示例 2:

image.png
输入: 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;
        }
    }
}

版权声明:
作者:cc
链接:https://www.techfm.club/p/48252.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>