#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void swap(int a[],int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
void Exchange(int a[]){/*二叉树顺序存储交换左右子树的核心代码*/
if(a[0]==-1)return;
int i,j,k,flag;
k=2;
do{
flag=0;
i=pow(2,k-1)-1;
j=pow(2,k)-2;
while(i<j){
if(a[i]!=-1||a[j]!=-1){
swap(a,i,j);
flag=1;
}
i++;
j--;
}
k++;
}while(flag!=0);
}
void preOrder(int a[],int i){
if(a[i]!=-1){
printf(" %d",a[i]);
preOrder(a,2*i+1);
preOrder(a,2*i+2);
}
}
void inOrder(int a[],int i){
if(a[i]!=-1){
inOrder(a,2*i+1);
printf(" %d",a[i]);
inOrder(a,2*i+2);
}
}
void postOrder(int a[],int i){
if(a[i]!=-1){
postOrder(a,2*i+1);
postOrder(a,2*i+2);
printf(" %d",a[i]);
}
}
int main(){
int n=10;
int k=log2(n)+1;
int side=pow(2,k+1)-1;
int a[side]={1,2,3,4,5,6,-1,8,-1,10};
for(int i=n;i<side;i++){
a[i]=-1;
}
printf("原顺序存储的二叉树前序遍历:\n");
preOrder(a,0);
printf("\n中序遍历:\n");
inOrder(a,0);
printf("\n后序遍历:\n");
postOrder(a,0);
Exchange(a);
printf("\n交换左右子树后的二叉树前序遍历:\n");
preOrder(a,0);
printf("\n中序遍历:\n");
inOrder(a,0);
printf("\n后序遍历:\n");
postOrder(a,0);
return 0;
}