数据结构八:
#include<stdio.h> typedef struct { int data[100]; int max; }qqq; qqq siftup(qqq p,int max){ //一次只是重新排序一边的左、右孩子 int temp = p.data[max-1]; //表示最后一个值 max==5表示最后一个数 int j = max-1; //表示最后一个值的下标 int i = (j-1)/2; while (j>=0){ if(p.data[i]<= temp) break; // 双亲的值较小则不做调整 else{ //双亲的值较大,交换 p.data[j] = p.data[i]; //孩子变双亲 j=i; //双亲变左右孩子 i=(i-1)/2; //变双亲 } p.data[j] = temp; //双亲变孩子 } //for(i=0;i<max;i++) // printf("%d ",p.data[i]); return p; //返回排好的序列 } int main(){ qqq p; int aa[100],j,i,max,cdu; printf("输入二叉树的长度:"); scanf("%d",&cdu); printf("输入二叉树的数据(按层次输入):\n"); for(i=0;i<cdu;i++){ //因为这里最后i++,所以后面也要延续 scanf("%d",&aa[i]); p.data[i]=aa[i]; } max=cdu; //长度,二叉树长度 +1 for(j=0;j<cdu-1;j++) p=siftup(p,max-j); printf("二叉树以小根堆方法排序后为(按层次输出):\n"); for(i=0;i<cdu;i++) printf("%d ",p.data[i]); printf("\n删除堆顶元素后的元素排序为(按层次输出):\n"); for(i=0;i<cdu-1;i++) p.data[i]=p.data[i+1]; for(i=0;i<cdu-1;i++) printf("%d ",p.data[i]); for(j=0;j<cdu-2;j++) p=siftup(p,max-j); printf("\n二叉树重新排序的结果为(按层次输出):\n"); for(i=0;i<cdu-1;i++) printf("%d ",p.data[i]); }
试验结果: