https://leetcode.com/problems/complete-binary-tree-inserter/

设计一个CBTInserter,使用给定完全二叉树初始化。三个功能;

  • CBTInserter(TreeNode root) initializes the data structure on a given tree with head node root;
  • CBTInserter.insert(int v) will insert a TreeNode into the tree with value node.val = v so that the tree remains complete, and returns the value of the parent of the inserted TreeNode;
  • CBTInserter.get_root() will return the head node of the tree.

主要涉及完全二叉树的插入。

解法一:dfs based

对给定的完全二叉树,先计算其最大高度maxlayer,以及深度最深的节点数numoflastlayer。如果numoflastlayer<2^(maxlayer-1),说明应该在maxlayer-1层第一个子节点数小于2的节点插入;如果numoflastlayer==2^(maxlayer-1),说明应该在maxlayer层第一个子节点处插入,利用dfs可以完成。插入过后及时更新maxlager和numoflastlayer。

class CBTInserter{
public:
void preorder(TreeNode* root,int layer){
if(layer>maxlayer){
maxlayer = layer;
numoflastlayer = ;
}else if(layer == maxlayer)
numoflastlayer++;
if(root->left!=NULL)
preorder(root->left, layer+);
if(root->right!=NULL)
preorder(root->right, layer+);
}
CBTInserter(TreeNode* root){
root_ =root;
maxlayer=-;
numoflastlayer=;
preorder(root,);
}
TreeNode* Insert(TreeNode* root, int v, int layer, int insertlayer){
if(layer == insertlayer-){
if(root->left == NULL){
root->left = new TreeNode(v);
return root;
}else if(root->right == NULL){
root->right = new TreeNode(v);
return root;
}
}else{
TreeNode* res = Insert(root->left, v, layer+, insertlayer);
if(res == NULL)
res = Insert(root->right, v, layer+, insertlayer);
return res;
}
return NULL;
}
int insert(int v){int maxnumoflastlayer = pow(, maxlayer);
TreeNode* res = NULL;
if(numoflastlayer<maxnumoflastlayer){
res = Insert(root_,v,, maxlayer);
numoflastlayer++;
}else{
res = Insert(root_,v,,maxlayer+);
maxlayer++;
numoflastlayer=;
}
return res->val;
}
TreeNode* get_root(){
return root_;
}
private:
TreeNode* root_;
int maxlayer;
int numoflastlayer;
};

解法二:bfs based

先使用bfs将所有子节点数为0和1的节点存入队列,然后维护这个队列,对头节点是插入新节点的节点,若对头节点只有右子树为NULL,那么插入后将其pop,并将其两个子节点指针压入队列。

class CBTInserter{
public:
TreeNode* root_;
queue<TreeNode*> nodes_0_1;
CBTInserter(TreeNode* root){
root_ = root;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
TreeNode* now = que.front();
que.pop();
if(now->left == NULL)
nodes_0_1.push(now);
else if(now->right == NULL)
nodes_0_1.push(now);
else{
que.push(now->left);
que.push(now->right);
}
}
}
int insert(int v){
TreeNode* root = nodes_0_1.front();
if(root->left!=NULL){
root->right = new TreeNode(v);
nodes_0_1.pop();
nodes_0_1.push(root->left);
nodes_0_1.push(root->right);
}
else
root->left = new TreeNode(v);
return root->val;
}
TreeNode* get_root(){
return root_;
}
};

最新文章

  1. java的三大框架(一)
  2. html5菜单折纸效果
  3. Linux用户组与用户组基本命令
  4. SharedPreferences实现自动登录记住用户名密码
  5. ArcGIS Engine 几何对象和WKB的转换
  6. 使用pip install 或者easy_install安装Python的各种包出现cc failed with exit status 1
  7. robot自动化测试(一)---安装
  8. Python 用SMTP发送邮件
  9. 小技巧:Oracle:sqlplus 显示行列字符数
  10. 学习笔记 intent属性
  11. ssh密钥登录
  12. PERL学习笔记---正则表达式
  13. Kubernetes - 腾讯蓝鲸配置平台(CMDB)开源版部署
  14. 批量镜像locator(比如表情模板)
  15. C#中EXCEL表格的内容进度条实现
  16. sql重复数据的过滤问题
  17. Git安装学习记录
  18. 查看linux 内存
  19. 【读书笔记】Linux内核设计与实现(第十八章)
  20. PL/SQL如何设置当前格局确保每次打开都给关闭前一样

热门文章

  1. 线程之间的通信socketpair【学习笔记】【原创】
  2. YTU 1099: Minesweeper
  3. Java中去除字符串中的所有空格
  4. CentOS 6.6实现永久修改DNS地址的方法
  5. 将json文件转换成insert语句的sql文件
  6. git根据commit生成patch(转载)
  7. Swift4 基本数据类型(范围型, Stride型, 数组, 字符串, 哈希表)
  8. bzoj 1499: [NOI2005]瑰丽华尔兹【dp+单调队列】
  9. bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
  10. CentOS 7安装并设置启动图形桌面