#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *left,*right;
}BTNode;
//创建完全二叉树
BTNode *CreateTree(int a[],int n)
{
BTNode **Q;
Q = (BTNode **)malloc((n+2)*sizeof(BTNode *));//创建队列
int front = 0,rear = 0;
BTNode *root,*p,*pa;
pa = root = (BTNode *)malloc(sizeof(BTNode));
root->data = a[0];
root->left = root->right = NULL;
for(int i = 1;i < n;i++)
{
p = (BTNode *)malloc(sizeof(BTNode));
p->data = a[i];
p->left = p->right = NULL;
Q[++rear] = p;//入队
if(pa->left == NULL)
{
pa->left = p;
}
else
{
pa->right = p;
pa = Q[++front];//出队
}
}
free(Q);
return root;
}
//按层次遍历
void levelsort(BTNode *root)
{
BTNode *p = root;
int front = 0,rear = 0;
BTNode **Q;
Q = (BTNode **)malloc(13*sizeof(BTNode*));
Q[++rear] = p;
while(front != rear)
{
p = Q[++front];
if(p->left != NULL)
{
Q[++rear] = p->left;
}
if(p->right != NULL)
{
Q[++rear] = p->right;
}
printf("%d ",p->data);
}
}
void AdjustL(BTNode *root)
{
BTNode *p,*pmin;
BTNode **Q = (BTNode **)malloc(13*sizeof(BTNode *));
int front = 0,rear = 0;
//将完全二叉树放入队列
Q[++rear] = root;
while(1)
{
p = Q[++front];//出队
if(p->left == NULL && p->right == NULL)
{
break;
}
else
{
if(p->left)
{
Q[++rear] = p->left;//左不空左入队
}
if(p->right)
{
Q[++rear] = p->right;//右不空右入队
}
}
}
//调整堆,front-1前是双亲节点,front至rear是叶子节点
int end = rear;//将队尾指针给end作为岗哨
while(front > 1)
{
while(1)
{
int tag = 1;//用来标记是否调整一次成功
for(int k = front-1;k > 0;k--)
{
p = Q[k];//出队
pmin = p;
if(p->data > p->left->data)
{
pmin = p->left;
}
if(p->right)
{
if(pmin->data > p->right->data)
{
pmin = p->right;
}
}
if(pmin != p)
{
int t = pmin->data;
pmin->data = p->data;
p->data = t;
tag = 0;
}
}
if(tag) // 如果没有交换,说明一次调整完成
{
break;
}
}
int t = root->data;
root->data = Q[rear]->data;
Q[rear]->data = t;
if(Q[front-1]->right)
{
Q[front-1]->right = NULL;
}
else
{
Q[front-1]->left = NULL;
front--;
}
rear--;
}
while(end > 0)
{
printf("%d ",Q[end]->data);
end--;
}
}
int main()
{
int a[12] = {3,2,13,8,12,7,9,1,6,11,4,5};
BTNode *root = CreateTree(a,12);
levelsort(root);
printf("\n");
AdjustL(root);
return 0;
}