队列
根据队列确定添加的父节点
class CBTInserter {
queue<TreeNode *>q;
TreeNode * newroot;
public:
CBTInserter(TreeNode* root) {
newroot=root;
q.push(newroot);
}
int insert(int v) {
while(true){
TreeNode *tmp=q.front();
if(tmp->left==NULL){
tmp->left=new TreeNode(v);
q.push(tmp->left);
return tmp->val;
}else if(tmp->right==NULL){
tmp->right=new TreeNode(v);
q.push(tmp->left);
q.push(tmp->right);
q.pop();
return tmp->val;
}
q.pop();
q.push(tmp->left);
q.push(tmp->right);
}
}
TreeNode* get_root() {
return newroot;
}
};
二进制表示
完全二叉树的每个节点序号可表示为如下:
从第一层开始,进制的每一位的0和1分别代表左子树和右子树
所以我们只要知道当前节点为第cnt个节点,再根据cnt的二进制表示找出该节点插入的位置
class CBTInserter {
queue<TreeNode *>q;
TreeNode * newroot;
int cnt=0;
public:
CBTInserter(TreeNode* root) {
newroot=root;
q.push(newroot);
while(!q.empty()){
cnt++;
TreeNode *tmp=q.front();
q.pop();
if(tmp->left!=NULL)q.push(tmp->left);
if(tmp->right!=NULL)q.push(tmp->right);
}
}
int insert(int v) {
cnt++;
TreeNode *newNode=new TreeNode(v);
TreeNode *iternode=newroot;
//int数据用32位表示,__builtin_clz()可以求出前导0的个数,32-前导零个数就是二进制的位数
int i=32-__builtin_clz(cnt);
//i-2是因为第一位不用比,而1不用左移,10表示1左移一位
for(i=i-2;i>0;i--){
if(cnt&(1<<i)){
iternode=iternode->right;
}else iternode=iternode->left;
}
if(cnt&1){
iternode->right=newNode;
}else iternode->left=newNode;
return iternode->val;
}
TreeNode* get_root() {
return newroot;
}
};