题目的链接在这里:
https://leetcode-cn.com/problems/complete-binary-tree-inserter/
题目大意
完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。
设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:
- CBTInserter(TreeNode root) 使用头节点为 root 的给定树初始化该数据结构;
- CBTInserter.insert(int v) 向树中插入一个新节点,节点类型为 TreeNode,值为 v 。使树保持完全二叉树的状态,并返回插入的新节点的父节点的值;
- CBTInserter.get_root() 将返回树的头节点。
一、示意图
二、解题思路
使用C++来写
代码如下:
/**
* 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:
TreeNode* root=nullptr;
//再创建一个队列
queue<TreeNode*> myQueue;
//第一个功能是初始化数据结构,从给定的根节点出发
//
CBTInserter(TreeNode* root) {
this->root=root;
myQueue.push(root);//进队列
while(!myQueue.empty()){
TreeNode* cur=myQueue.front();
if(cur->left)
myQueue.push(cur->left);
//如果他左边存在的话,那就插入
else
break;//跳出if循环
if(cur->right)
//如果他右边存在的话
myQueue.push(cur->right);
else
break;
myQueue.pop();
}
}
//第二个方法是插入
int insert(int v) {
TreeNode* cur=myQueue.front();//取头结点
if(!cur->left){
//如果左节点不存在的话
myQueue.push(cur->left=new TreeNode(v));
return cur->val;//并返回父节点的值
}
else{
myQueue.push(cur->right=new TreeNode(v));
//再是返回对应的值
//不知道这个什么操作
myQueue.pop();
return cur->val;
}
}
TreeNode* get_root() {
return root;
}
};
/**
* 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();
*/