---
title: 919. Complete Binary Tree Inserter
tags: leetcode
disqus: foodtoothshackmd
---
https://leetcode.com/problems/complete-binary-tree-inserter/
## Idea
### Complete binary tree related calculation
Let complete binary tree be $T$ with height $h$, and node number $N$, and it is constructed using a $N$-lengh array.
1. The maximum number of nodes in level $k(k \geq 1)$ is $2^{k-1}$
2. The maximum number of nodes in the tree is $2^k - 1$
3. The number of leaf nodes in the tree is
\begin{cases}
\frac N2, & \text{if $N$ is even} \\
\frac {N + 1}2, & \text{if $N$ is odd}
\end{cases}
4. If a parent node is at index $i$ in the array, then the left child of that node is at index $2i + 1$ and right child is at index $2i + 2$ in the array.
5. The index of current opening node(waiting for inserting new node) is $\lceil \frac N2 \rceil - 1$ (or $\lfloor \frac {N - 1}2 \rfloor$).
## Code
```cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class CBTInserter {
public:
CBTInserter(TreeNode *root) {
nodes.push_back(root);
for (int i = 0; i < nodes.size(); ++i) {
if (nodes[i]->left != NULL) nodes.push_back(nodes[i]->left);
if (nodes[i]->right != NULL) nodes.push_back(nodes[i]->right);
}
}
int insert(int v) {
TreeNode *node = new TreeNode(v);
auto count = nodes.size();
auto index = static_cast<int>(std::ceil(count / 2.)) - 1;
// auto index = (count - 1) / 2; // same as the `std::ceil` one
if (count % 2 == 0) {
nodes[index]->right = node;
} else {
nodes[index]->left = node;
}
nodes.push_back(node);
return nodes[index]->val;
}
TreeNode *get_root() { return nodes[0]; }
std::vector<TreeNode *> nodes{};
};
/**
* Your CBTInserter object will be instantiated and called as such:
* CBTInserter* obj = new CBTInserter(root);
* int param_1 = obj->insert(v);
* TreeNode* param_2 = obj->get_root();
*/
```