完全二叉树O(1)插入

919. 完全二叉树插入器 - 力扣(LeetCode)

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

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

实现 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 次

import java.util.LinkedList;
import java.util.Queue;

class CBTInserter {
    // 使用队列按顺序保存只有1个或没有子节点的节点,然后每次从队列头取一个节点创建新节点(先左节点后右节点)
    Queue<TreeNode> data;
    TreeNode root;

    public CBTInserter(TreeNode root) {
        this.root = root;

        Queue<TreeNode> queue = new LinkedList<>();
        data = new LinkedList();
        queue.offer(root);
        // 找到所有符合插入条件的节点
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node.left != null) {
                queue.offer(node.left);
            }

            if (node.right != null) {
                queue.offer(node.right);
            }
            // 把所有符合插入条件的节点放到队列data中
            if (node.left == null || node.right == null) {
                data.offer(node);
            }
        }
    }

    public int insert(int val) {
        TreeNode d = new TreeNode();
        d.val = val;
        data.offer(d);

        TreeNode first = data.peek();
        // 先插入左节点
        if (first.left == null) {
            first.left = d;
        } 
        // 然后插入左节点
        else if (first.right == null) {
            first.right = d;
            data.poll();
        } else {
            // 理论不存在该情况
            data.poll();
        }
        return first.val;
    }

    public TreeNode get_root() {
        return root;
    }


    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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值