根据层序遍历构建二叉树
解题思路:
如果所给层序遍历数组非空,先构建出root结点并加入辅助队列qu,之后当qu非空时,每次从qu中取出一个结点node,从头开始取数组中的元素作为node的左右孩子结点。并将非空的左右孩子结点加入到qu中。持续上述操作直到qu为空。
// 根据层序遍历构建二叉树
#include<iostream>
#include<queue>
#include<string>
#include<vector>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
TreeNode():val(0),left(nullptr),right(nullptr){}
};//这个位置一定要加上分号
TreeNode* queue_to_treenode(const vector<int>&);
void print_treenode(TreeNode*,vector<int>&);
int main(){
vector<int>vec{1,-1,2,2};
TreeNode *root = queue_to_treenode(vec);
vector<int> ans;
print_treenode(root,ans);
for(const int&num:ans) cout<<num<<" ";
cout<<endl;
return 0;
}
TreeNode *queue_to_treenode(const vector<int>&vec){
if(vec.size()==0) return NULL;
queue<TreeNode*>qu;
TreeNode *root = new TreeNode(vec[0]);
qu.push(root);int in=1;
while(!qu.empty()){
TreeNode *node = qu.front();qu.pop();
if(in<vec.size()){
TreeNode *left = (vec[in]==-1)?NULL:new TreeNode(vec[in]);
node->left = left;
if(left) qu.push(left);
++in;
}
if(in<vec.size()){
TreeNode *right = (vec[in]==-1)?NULL:new TreeNode(vec[in]);
node->right = right;
if(right) qu.push(right);
++in;
}
}
运行结果如下图:
重新定义“print_treenode”让其不打印没有必要的NULL结点
void print_treenode(TreeNode *cur,vector<int>&ans){
if(!cur) return ;
queue<TreeNode*> qu;
qu.push(cur);
while(!qu.empty()){
TreeNode *node = qu.front();qu.pop();
if(!node) ans.push_back(-1);
else{
ans.push_back(node->val);
qu.push(node->left);
qu.push(node->right);
}
}
int in=ans.size()-1;
for(;in>=0&&ans[in]==-1;--in);
ans.resize(in+1);
//使用swap技术删除不用的内存空间
vector<int>(ans).swap(ans);
}
运行结果如下图: