仅验证了样例。
给出一个树的中序遍历,并且这棵树的数据符合小根堆(但不是堆,因为不是完全二叉树),请你给出这棵树的层序遍历。
这道题关键在于如何建出这样一棵树。可以发现,我们把每一棵子树的根节点取出来,他都是当前序列中最小的那个值。因此在建树时每次都遍历找出序列中的最小值,让他作为根划分左右子树,然后对左右子树也这样递归建立,就可以得到这棵树了。最后写一个层序遍历代码就好。
本来我还在想只有中序遍历怎么能建立呢,但如果总结一下以前的树的建立,其实基本都能抽象成如何划分左右子树的问题,大概以后解题也可以往这方面靠吧。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int inf=1000000000;
struct node{
int data;
node* left;
node* right;
};
vector<int> list,level;
node* build(node* root,int l,int r){
if(l>r){
return NULL;
}
root=new node;
int k;
int mindata=inf;
for(int i=l;i<=r;i++){
if(list[i]<mindata){
mindata=list[i];
k=i;
}
}
root->data=mindata;
root->left=root->right=NULL;
root->left=build(root->left,l,k-1);
root->right=build(root->right,k+1,r);
return root;
}
void levelorder(node* root){
queue<node*> q;
q.push(root);
while(!q.empty()){
node* top=q.front();
q.pop();
level.push_back(top->data);
if(top->left!=NULL){
q.push(top->left);
}
if(top->right!=NULL){
q.push(top->right);
}
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
list.push_back(temp);
}
node* root=NULL;
root=build(root,0,n-1);
levelorder(root);
for(int i=0;i<level.size();i++){
if(i!=0){
printf(" ");
}
printf("%d",level[i]);
}
return 0;
}