​力扣解法汇总919-完全二叉树插入器

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:

力扣


描述:

完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。

设计一种算法,将一个新节点插入到一个完整的二叉树中,并在插入后保持其完整。

实现 CBTInserter 类:

CBTInserter(TreeNode root) 使用头节点为 root 的给定树初始化该数据结构;
CBTInserter.insert(int v)  向树中插入一个值为 Node.val == val的新节点 TreeNode。使树保持完全二叉树的状态,并返回插入节点 TreeNode 的父节点的值;
CBTInserter.get_root() 将返回树的头节点。
 

示例 1:

输入
["CBTInserter", "insert", "insert", "get_root"]
[[[1, 2]], [3], [4], []]
输出
[null, 1, 2, [1, 2, 3, 4]]

解释
CBTInserter cBTInserter = new CBTInserter([1, 2]);
cBTInserter.insert(3);  // 返回 1
cBTInserter.insert(4);  // 返回 2
cBTInserter.get_root(); // 返回 [1, 2, 3, 4]
 

提示:

树中节点数量范围为 [1, 1000] 
0 <= Node.val <= 5000
root 是完全二叉树
0 <= val <= 5000 
每个测试用例最多调用 insert 和 get_root 操作 104 次

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/complete-binary-tree-inserter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

* 解题思路:
* 层序遍历的思想。记录最下面两个层级。
* 每次加入节点的时候,判断上面的层级是否达到下面层级集合的两倍,
* 如果没有达到,则直接加入下面的层级。
* 如果达到,则使用下面的层级替换上面层级,然后把下面的层级集合置为空。

代码:

public class Solution919 {

    public static class CBTInserter {
        TreeNode root;
        List<TreeNode> parentList = new ArrayList<>();
        List<TreeNode> currentList = new ArrayList<>();

        public CBTInserter(TreeNode root) {
            this.root = root;
            parentList.add(root);
            for (int i = 0; i < parentList.size(); i++) {
                TreeNode treeNode = parentList.get(i);
                TreeNode left = treeNode.left;
                TreeNode right = treeNode.right;
                if (left != null) {
                    currentList.add(left);
                } else {
                    break;
                }
                if (right != null) {
                    currentList.add(right);
                } else {
                    break;
                }
                if (i == parentList.size() - 1) {
                    parentList.clear();
                    parentList.addAll(currentList);
                    currentList.clear();
                    i = -1;
                }
            }
        }

        public int insert(int val) {
            TreeNode parentNode;
            TreeNode childNode = new TreeNode(val);
            if (currentList.size() < parentList.size() * 2) {
                parentNode = parentList.get(currentList.size() / 2);
                if (currentList.size() % 2 == 0) {
                    parentNode.left = childNode;
                } else {
                    parentNode.right = childNode;
                }
            } else {
                parentList.clear();
                parentList.addAll(currentList);
                currentList.clear();
                parentNode = parentList.get(0);
                parentNode.left = childNode;
            }
            currentList.add(childNode);
            return parentNode.val;
        }

        public TreeNode get_root() {
            return root;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失落夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值