解题思路
提及完全二叉树就想到BFS,因为完全二叉树的构建离不开层次遍历,首先定义好存储有空位置的节点的队列以及根节点的指针,在构造函数中,将根节点指针指向根节点,接着用BFS遍历二叉树将所有满足条件的节点全部放入存储有空位置的节点的队列中,insert函数就是处理队列的头,如果为叶子,就填充左节点,否则填充完右节点后直接pop(),同时把新节点放入队列后面,get_root函数直接返回根节点指针即可,代码如下:
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class CBTInserter {
private:
TreeNode* node;
// 存储有空位置的节点
queue<TreeNode*> q;
public:
CBTInserter(TreeNode* root) {
node = root;
queue<TreeNode*> temp;
temp.emplace(root);
// BFS遍历二叉树
while(!temp.empty()) {
int n = temp.size();
for(int i = 0; i < n; i ++) {
TreeNode* tree = temp.front();
if(!(tree->left != nullptr && tree->right != nullptr)) {
q.emplace(tree);
}
if(tree->left != nullptr) temp.emplace(tree->left);
if(tree->right != nullptr) temp.emplace(tree->right);
temp.pop();
}
}
}
int insert(int val) {
TreeNode* tree = new TreeNode(val);
TreeNode* temp = q.front();
// 叶子节点,完全二叉树,所以判断左子树即可
if(temp->left == nullptr) {
temp->left = tree;
} else if(temp->right == nullptr) {
temp->right = tree;
q.pop();
}
q.emplace(tree);
return temp->val;
}
TreeNode* get_root() {
return node;
}
};
/**
* Your CBTInserter object will be instantiated and called as such:
* CBTInserter* obj = new CBTInserter(root);
* int param_1 = obj->insert(val);
* TreeNode* param_2 = obj->get_root();
*/