完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。
设计一种算法,将一个新节点插入到一个完整的二叉树中,并在插入后保持其完整。
实现 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;
}
}
}