#include <iostream>
#include<stdlib.h>
// 创建一个结构体
typedef struct node{
int data;
struct node *left,*right;
}BiTreeNode;
int rear=0,front=0;//全局变量
//创建全然二叉树
BiTreeNode *CreateBiTree(int a[],BiTreeNode **Q,int n){
BiTreeNode *root,*p,*t=NULL;
int i;
//先把根节点创建出来
root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
root->data=a[0];
root->left=root->right=NULL;
Q[++rear] = root;//新添加的
for(i=1;i<n;i++){
p=(BiTreeNode *)malloc(sizeof(BiTreeNode));
p->left=p->right=NULL;
p->data=a[i];
if(t==NULL)
t=Q[++front];
//if(!t)
//p=t->left;
if(!t->left)
t->left = p;
else
//p=t->right;
if (!t->right){
t->right = p;
t=NULL;
}
//p=Q[++rear];
Q[++rear] = p;
}
return root;
}
//void Adjust(BiTreeNode *root,BiTreeNode **Q){
void Adjust(BiTreeNode **Q){
int k,flag=0,m;
BiTreeNode * t;
while(1){
k=front;
flag=0;
while(k>0){
t=Q[k];
//if(t->data > t->left->data){
if(t->data < t->left->data){
m=t->data;
t->data=t->left->data;
t->left->data=m;
flag=1;
}
//if(!t->right&&t->data > t->right->data){
if(t->right&&t->data < t->right->data){
m=t->data;
t->data=t->right->data;
t->right->data=m;
flag=1;
}
k--;
}
if(!flag)
break;
}
}
void printBiTree(BiTreeNode **Q,int n){
int i;
//for(i=n-1;i>0;i--)
for (i = n; i > 0; i--)
printf("%d ",Q[i]->data);
printf("\n");
}
int main(int argc, char** argv) {
int a[8]={3,2,5,8,4,7,6,9};
int m; // 用来交换
BiTreeNode **Q,*root;
Q=(BiTreeNode **)malloc(9*sizeof(BiTreeNode *));
//创建全然二叉树
root=CreateBiTree(a,Q,8);
//调整成大根堆
Adjust(Q);
while(rear > 1){
m=Q[rear]->data;
Q[rear]->data=Q[1]->data;
Q[1]->data=m;
rear--; // 砍掉叶子
if(Q[front]->right)
// Q[rear]->right=NULL;
Q[front]->right = NULL;
else{
Q[front]->left=NULL;
front--;
}
Adjust(Q);//新添加的
}
//输出
printBiTree(Q,8);
return 0;
}