数据结构八:

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

试验结果:

 

posted on 2019-06-13 14:17  ZOne=w=  阅读(119)  评论(0编辑  收藏  举报