#include <iostream>
#include <cstdlib>
#include<queue>
#include <stack>
using namespace std;


//二叉树链表的存储结构
typedef struct BiTNode
{
    int data;//节点数据
    struct BiTNode *lchild, *rchild;//左右孩子指针
}BiTNode, *BiTree;
//二叉树的建立
void CreatBiTree(BiTree &T)
{
    int  ch;
    cin >> ch;
    if (ch == 0)
        T = NULL;
    else
    {
        T = new BiTNode;//生成根节点
        if (!T)
            exit(1);
        T->data = ch;
        CreatBiTree(T->lchild); //构造左子树
        CreatBiTree(T->rchild); //构造右子树
    }
}
//创建二叉树
BiTNode* create(int b[], int n)
{
    BiTNode* ptree =new  BiTNode  [n];
    int i;
    for (i = 0; i < n; i++)
    {
        ptree[i].data = b[i];//给每个节点赋值
        ptree[i].lchild = NULL;//
        ptree[i].rchild = NULL;
    }
    for (i = 0; 2*i+1<n; i++)//原来的父亲节点范围为[1,n/2],所以要取到n/2
    {
        ptree[i].lchild = &ptree[2 * i + 1];//把第2*i+1个结点的地址赋给左孩子
        ptree[i].rchild = &ptree[2 * i + 2];//把第2*i+2个结点的地址赋给右孩子
    }
    return  ptree;
}
//前序遍历
void PreOrderTraverse(BiTNode* T)
{
    if (!T)
        return;
    cout << T->data<<" ";//显示节点数据
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}
//中序遍历
void InOrderTraverse(BiTree T)
{
    if (!T)
        return;
    InOrderTraverse(T->lchild);
    cout << T->data << " "; //显示节点数据
    InOrderTraverse(T->rchild);
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
    if (!T)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    cout << T->data << " "; //显示节点数据
}
void Levelorder(BiTNode *T)//层析遍历
{
    if (!T)
        return;
    BiTNode *temp;
    queue<BiTNode*>q;
    q.push(T);
    while (!q.empty())
    {
        temp = q.front();
        cout << temp->data << " ";
        if (temp->lchild)
            q.push(temp->lchild);
        if (temp->rchild)
            q.push(temp->rchild);
        q.pop();
    }
}

int main()
{
    
    
    BiTNode *T=NULL;
    BiTNode *T1;
    int a[7] = { 1,2,3,4,5,6,7};
    int n = size(a);
    T1=create(a, n);
    cout << "前序排序:";
    Levelorder(T1);//层析遍历
    cout << endl;
    cout << "前序排序:";
    PreOrderTraverse(T1); //前序排序
    cout << endl;
    cout << "中序排序:";
    InOrderTraverse(T1); //中序排序
    cout << endl;
    cout << "后序排序:";
    PostOrderTraverse(T1); //后序排序
    cout << endl;
    return 0;
}