#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(" "); } 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; }