Java 在二叉树中增加一行

623. 在二叉树中增加一行

中等

给定一个二叉树的根 root 和两个整数 valdepth ,在给定的深度 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. 因为在深度为2是添加一行就是在第二行与第一行之间添加一行节点,所以初始化一个变量为 1,记录要添加一行位置与终止循环条件

  1. 当添加的一行的左右节点为空时,且深度正好为要添加一行深度,则让该节点的左右节点都为要添加的节点

  1. 当要添加的节点左或右不为空,借助中间节点拼接树

  1. 当深度为1时让要添加的节点左子树为根节点即可。

/**
 * 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) {
        Queue<TreeNode> queue = new LinkedList<>();
        if(depth == 1){
            TreeNode temp = new TreeNode(val);
            temp.left = root;
            System.out.println(temp.val+" "+temp.left.val);
            return temp;
        }
        // TreeNode temp = new TreeNode(val);
        TreeNode dummy = root;
        queue.add(dummy);
        int count = 1;
        while (queue.size() > 0){
            int n = queue.size();
            for (int i = 0; i < n; i++) {
                TreeNode remove = queue.remove();
                if(remove.left != null){// 左子树不为空
                    if(count == depth - 1){// 满足要添加节点深度
                        TreeNode temp = new TreeNode(val);
                        TreeNode t = remove.left;// 中间节点拼接
                        remove.left = temp;
                        temp.left = t;
                    }else {// 不满足节点深度继续添加下一层节点
                        queue.add(remove.left);
                    }
                }else if(count == depth - 1){// 左子树为空且满足添加节点深度,直接让添加节点为该节点左子树
                    TreeNode temp = new TreeNode(val);
                    remove.left = temp;
                }
                if(remove.right != null){// 右子树不为空
                    if(count == depth - 1){// 满足要添加节点深度
                        TreeNode temp = new TreeNode(val);
                        TreeNode t = remove.right;// 中间节点拼接
                        remove.right = temp;
                        temp.right = t;
                    }else {// 不满足节点深度继续添加下一层节点
                        queue.add(remove.right);
                    }
                }else if(count == depth - 1){// 左子树为空且满足添加节点深度,直接让添加节点为该节点左子树
                    TreeNode temp = new TreeNode(val);
                    remove.right = temp;
                }
            }
            // if(count == depth){
            //     break;
            //}
            count++;
        }
        return dummy;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值