#include <iostream>
#include <vector>
using namespace std;
bool findit=1; int elem;
vector<int> create(vector<int> item){ //构造大根堆(给出无序二叉堆)
decltype(item.size()) num=0,str=0;
for(auto ix:item){
num=str;
decltype(item.size()) p=(num-1)/2;
int temp=item[num];
while(1){
if(temp>item[p]){
item[num]=item[p];
num=p;
p=(p-1)/2;
}
else break;
}
item[num]=temp;
++str;
}
return item;
}
void answer(vector<int> item){ //得到大根堆
for(auto num:item)
cout<<num<<" ";
cout<<endl;
}
vector<int> add(vector<int> item){ //大根堆添加元素
decltype(item.size()) num=item.size()-1;
decltype(item.size()) p=(num-1)/2;
int temp=item[num];
while(1){
if(temp>item[p]){
item[num]=item[p];
num=p;
p=(p-1)/2;
}
else break;
}
item[num]=temp;
return item;
}
vector<int> delet(vector<int> item){ //大根堆删除元素
decltype(item.size()) num=0;
for(auto ix:item){
if(ix==elem) break;
num++;
}
if(num==item.size()){
findit=0;
return item;
}
item[num]=item[item.size()-1];
// item[item.size()-1]=0;
item.pop_back();
int temp=item[num];
decltype(item.size()) l=2*num+1;
int left=item[l];
while(1){
if(l>=item.size()) break;
if(l+1<item.size()&&item[l]<item[l+1]) ++l;
if(temp>item[l]) break;
else{
item[num]=item[l];
num=l;
l=2*l+1;
}
}
item[num]=temp;
return item;
}
int main(){
vector<int> item;
cout<<"~~请输入一组元素构成一个二叉堆,以0表示输入结束: ";
while(cin>>elem){
if(elem==0) break;
item.push_back(elem);
}
item=create(item);
cout<<"~~构成的大根堆是: ";
answer(item);
cout<<"~~增加一些元素,以0表示输入结束: ";
while(cin>>elem){
if(elem==0) break;
item.push_back(elem);
item=add(item);
}
cout<<"~~构成的大根堆是: ";
answer(item);
cout<<"~~删除一些元素,以0表示输入结束: ";
while(cin>>elem){
if(elem==0) break;
item=delet(item);
}
cout<<"~~构成的大根堆是: ";
if(findit==0) cerr<<"输入错误!";
else answer(item);
}