leetcode刷题日记-【623. 在二叉树中增加一行】

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

题目描述

给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 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

题目元素

  • 给定一个二叉树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);
}
复制代码

猜你喜欢

转载自juejin.im/post/7128385443959160869