/*
第 16  题:
题目(微软): 
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
      8
      /  \
    6   10
   / \  / \
   5  7 9  11
打印出来:8 6 10 5 7 9 11
BFS广度优先搜索 
*/ 
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<queue> 
using namespace std;
#define MAX 20
struct BTreeNode{
   int data;
   BTreeNode *left,*right;
}; 
//建立二叉树 
BTreeNode * CreateTree(int data[],int pos,int len)
{
   BTreeNode *tree;
   if(pos>=len) 
   {
      return NULL;
   }
   else
   {
      tree=(BTreeNode *)malloc(sizeof(BTreeNode));
      tree->data=data[pos];
      tree->left=CreateTree(data,2*pos+1,len);//数组坐标 
      tree->right=CreateTree(data,2*pos+2,len);
      return tree;
   }
   
}
void InOrder(BTreeNode *tree)
{
   if(tree!=NULL)
   {
      InOrder(tree->left);
      printf("%d ",tree->data);
      InOrder(tree->right);
   }
}
void BFS(BTreeNode *root)
{
   BTreeNode *temp,*start;
   queue<BTreeNode *> q;
   
   q.push(root);
   while(!q.empty())
   {
      start=q.front();
      q.pop();
      
      if(start->left!=NULL)
         q.push(start->left);
      
      if(start->right!=NULL)
         q.push(start->right);
      printf("%d ",start->data); 
   }
}
int main(){
   
   int data[]={8,6,10,5,7,9,11};
   int len=sizeof(data)/sizeof(int);
   
   BTreeNode *tree=CreateTree(data,0,len);
   printf("中序遍历:\n");//左根右 
   InOrder(tree);printf("\n");
   printf("打印结果:\n");
   BFS(tree);printf("\n");
   
   return 0;
}