题目
完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。
设计一种算法,将一个新节点插入到一个完整的二叉树中,并在插入后保持其完整。
实现 CBTInserter 类:
CBTInserter(TreeNode root) 使用头节点为 root 的给定树初始化该数据结构;
CBTInserter.insert(int v) 向树中插入一个值为 Node.val == val的新节点 TreeNode。使树保持完全二叉树的状态,并返回插入节点 TreeNode 的父节点的值;
CBTInserter.get_root() 将返回树的头节点。
示例
输入
[“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]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/complete-binary-tree-inserter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:队列模拟![在这里插入图片描述](https://img-blog.csdnimg.cn/35e4f9a588a34c10b3cbb7003af0bf71.png)
Java实现
class CBTInserter {
Queue<TreeNode> queue, candidate;
TreeNode root;
public CBTInserter(TreeNode root) {
this.root = root;
queue = new LinkedList<>();
candidate = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int sz = queue.size();
for (int i = 0; i < sz; i++) {
TreeNode cur = queue.poll();
if (cur.left != null) queue.offer(cur.left);
if (cur.right != null) queue.offer(cur.right);
//如果左子树为空或者右子树为空则加入candidate队列
if (!(cur.left != null && cur.right != null)) candidate.offer(cur);
}
}
}
public int insert(int val) {
TreeNode node = candidate.peek();
TreeNode var = new TreeNode(val);
if (node.left == null) {
node.left = var;
} else {
//此时,右子树也插入了节点。该节点左右子树都不为空
//因此,要从candidate里弹出该节点。
node.right = var;
candidate.poll();
}
candidate.offer(var);
return node.val;
}
public TreeNode get_root() {
return root;
}
}