#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;
}
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
数据结构-堆排序其他
-
[golang] 数据结构-堆排序
golang实现堆排序及其原理
选择排序 go 堆排序 -
数据结构与算法之堆排序
数据结构与算法之堆排序前提条件基本概念参考文献前提条件熟悉C语言与指针熟悉数据结
数据结构 算法 结点 堆排序 大根堆 -
数据结构 排序(堆排序)
TOPN算法排序,堆排序
数据 #include 数组 2d 堆排序