#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <math.h>
using namespace std;
typedef struct BTNode
{
int data;
struct BTNode *lc;
struct BTNode *rc;
}BTNode,*BiTree;

   int ss[]={1,3,5,-1,-1,2,-1,-1,4,6,-1,-1,-1};
   int a[]={0,1,3,5,2,4,6};
     int k=0;
     void array()
     {   k=0;
         int i=0;   int t[]={1,2,3,-1,-1,4,5,6,-1,-1,-1};
       for(i=0;i<11;i++)
        {
            ss[i]=t[i];cout<<ss[i]<<" ";
        }
     }
void Creat(BiTree &T)
{
   int x; 
     x=ss[k++];
    if (x==-1) T=NULL;
    else{
        T=new BTNode;
        T->data=x;
        Creat(T->lc);
        Creat(T->rc);
    }
}
 
 
 

void print_as_tree(BiTree T,int lay)
{
 if(T)
 {
 print_as_tree(T->lc,lay+1);
	 for(int j=0;j<lay;j++)printf("*");cout<<T->data<<endl;
 print_as_tree(T->rc,lay+1);
 }
 else return;
}

void lay(BiTree root,int n)                         /*/ 层次打印 /*/
   {  //assert(root)
      int k=1; int m=1;int i=0;
      BiTree b=root;
      queue<BiTree> q;  
          q.push(b);  
    while(!q.empty())
  {
     b=q.front();  if(b->lc) q.push(b->lc); if(b->rc) q.push(b->rc);
     m=pow(2,k-1); for(i=0;i<n/2;i++) cout<<" ";cout<<b->data; q.pop();
     while(--m)
       {
        for(i=0;i<2*(n/2)+1;i++) cout<<" ";
		 if(!q.empty())
		 { b=q.front();  
		  if(b->lc) q.push(b->lc); 
		  if(b->rc) q.push(b->rc);
		  cout<<b->data; q.pop();
 		 }
         else cout<<"#";
       }
      cout<<endl;
      n=n/2; 
      k++;
   }
   cout<<endl;
}

void HeapAdjust(int *a,int i,int size)  //调整堆 
{
    int lchild=2*i;       //i的左孩子节点序号 
    int rchild=2*i+1;     //i的右孩子节点序号 
    int max=i;            //临时变量 
    if(i<=size/2)          //如果i是叶节点就不用进行调整 
    {
        if(lchild<=size&&a[lchild]>a[max])
        {
            max=lchild;
        }    
        if(rchild<=size&&a[rchild]>a[max])
        {
            max=rchild;
        }
        if(max!=i)
        {
            swap(a[i],a[max]);
            HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆 
        }
    }        
}

void BuildHeap(int *a,int size)    //建立堆 
{
    int i;
    for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2 
    {
        HeapAdjust(a,i,size);    
    }    
} 

void HeapSort(int *a,int size)    //堆排序 
{
    int i;
    BuildHeap(a,size);
    for(i=size;i>=1;i--)
    {
        //cout<<a[1]<<" ";
        swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 
          //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆 
          HeapAdjust(a,1,i-1);      //重新调整堆顶节点成为大顶堆
    }
} 

int main(int argc, char *argv[])
{
    int size=6,i;
  
     BiTree S; BiTree T;
    Creat(S); 
     lay(S,3);
     print_as_tree(S,3);
     HeapSort(a,size);
        for(i=1;i<=size;i++)
            cout<<a[i]<<" ";
        cout<<endl;
        k=0;
       array(); cout<<endl;
       k=0;Creat(T);
      lay(T,3);
      print_as_tree(T,3);
    return 0;
}
/*************************
http://anycodes.cn/zh/
*************************/
 1
3 4
5 2 6 #

*****5
****3
*****2
***1
*****6
****4
1 2 3 4 5 6 
1 2 3 -1 -1 4 5 6 -1 -1 -1 
 1
2 3
4 5 6 #

*****3
****2
*******6
******5
*****4
***1
 //待更好设计  来演示