#include "stdio.h"
#include "stdlib.h"
#define Maxsize 30
int showArray(int a[],int n)
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int preOrder(int a[],int k,int n)
{
if(k<n&&a[k]!=-1)
{
printf("%d ",a[k]);
preOrder(a,2*k+1,n);
preOrder(a,2*k+2,n);
}
}
int midOrder(int a[],int k,int n)
{
if(k<n&&a[k]!=-1)
{
midOrder(a,2*k+1,n);
printf("%d ",a[k]);
midOrder(a,2*k+2,n);
}
}
int postOrder(int a[],int k,int n)
{
if(k<n&&a[k]!=-1)
{
postOrder(a,2*k+1,n);
postOrder(a,2*k+2,n);
printf("%d ",a[k]);
}
}
int preOrder_non(int a[],int k,int n)
{ int st[Maxsize];
int top=0;
if(a[k]==-1)
return 0;
while(a[k]!=-1&&k<n || top!=0)
{
while(a[k]!=-1&&k<n)
{
printf("%d ",a[k]);
st[top++]=k;
k=2*k+1;
}
if(top!=0)
{
k=st[--top];
k=2*k+2;
}
}
}
int postOrder_non(int a[],int k,int n)
{ int st[Maxsize];
int top=0,flag,i,r;
if(a[k]==-1)
return 0;
do
{
while(k<n&&a[k]!=-1)
{
st[top++]=k;
k=2*k+1;
}
r=-1;
flag=1;
// for(int j=0;j<top;j++)
// printf(" %d ",st[j]);
// printf("______\n");
while(top!=0&&flag==1)
{
i=st[top-1];
if(2*i+2>n || a[2*i+2] == r )
{ top--;
printf("%d ",a[i]);
r=a[i];
}
else
{
k=2*i+2;
flag=0;
}
}
}while(top!=0);
}
int leafCount(int a[],int k,int n)
{ int l,r;
if(k<n&&a[k]!=-1)
{
if(2*k+1==-1 && 2*k+2 == -1 || 2*k+1>=n && 2*k+2 >= n)
return 1;
l=leafCount(a,2*k+1,n);
r=leafCount(a,2*k+2,n);
return l+r;
}
return 0;
}
int main()
{
int a[13]={5,8,9,-1,-1,7,6,-1,-1,-1,-1,-1,3};
int n=13;
showArray(a,n);
preOrder(a,0,n); printf("\n");
midOrder(a,0,n); printf("\n");
postOrder(a,0,n); printf("\n");
preOrder_non(a,0,n); printf("\n");
return 1;
}