#include<stdio.h>
#include<stdlib.h>

typedef struct Bitree //二叉树节点,结构定义
{
    int data;
    struct Bitree *Lchild,*Rchild;
	Bitree(int _data)
	{
		data=_data;
		Lchild=NULL;
		Rchild=NULL;
	}
	void SetChild(struct Bitree *Lchild,struct Bitree *Rchild)
	{
		this->Lchild=Lchild;
		this->Rchild=Rchild;
	}
}BitreeNode,*LinkBitree;


typedef struct Stack //保存二叉树节点的栈
{
    LinkBitree data[20];
    int top,bottom;
}Stack,*StackList;


LinkBitree CreatBitree();
StackList InitStack();
void InorderTraverse(LinkBitree,StackList);

int main()
{
    LinkBitree BitreeHead;//二叉树头结点指针
    StackList pStack;//栈指针
    //printf("请输入根结点的值:e=  ");
    BitreeHead=CreatBitree();
    pStack=InitStack();
    InorderTraverse(BitreeHead,pStack);
    return 0;
}

LinkBitree CreatBitree()
{
	/*
    int edata;
    LinkBitree Head;
    //scanf("%d",&edata);
	edata=1;
    if(edata==0)
    {
        Head=NULL;
    }
    else
    {
        Head=(LinkBitree)malloc(sizeof(BitreeNode));
        if(Head==NULL)
        {
            printf("内存分配失败!!");
            exit(0);
        }
        else
        {
            Head->data=edata;
            printf("请输入结点%d的左孩子的值:e= ",Head->data);
            Head->Lchild=CreatBitree();
            printf("请输入结点%d的右孩子的值:e= ",Head->data);
            Head->Rchild=CreatBitree();
        }
    }
    return Head;
	*/
	LinkBitree A=new BitreeNode(1);
	LinkBitree B1=new BitreeNode(21);LinkBitree B2=new BitreeNode(22);
	LinkBitree C1=new BitreeNode(31);LinkBitree C2=new BitreeNode(32);LinkBitree C3=new BitreeNode(33);LinkBitree C4=new BitreeNode(34);
	LinkBitree D1=new BitreeNode(41);LinkBitree D2=new BitreeNode(42);LinkBitree D3=new BitreeNode(43);LinkBitree D4=new BitreeNode(44);
	LinkBitree D5=new BitreeNode(45);LinkBitree D6=new BitreeNode(46);LinkBitree D7=new BitreeNode(47);LinkBitree D8=new BitreeNode(48);
	
	A->Lchild=B1;A->Rchild=B2;
	B1->Lchild=C1;B1->Rchild=C2;B2->Lchild=C3;B2->Rchild=C4;
	C1->SetChild(D1,D2);C2->SetChild(D3,D4);C3->SetChild(D5,D6);C4->SetChild(D7,D8);
	return A;
}

StackList InitStack()
{
    StackList pStack;
    pStack=(StackList)malloc(sizeof(Stack));
    if(pStack==NULL)
    {
        printf("内存分配失败!!");
        exit(0);
    }
    else
    {
        pStack->top=0;
        pStack->bottom=0;
    }
    return pStack;
}

void InorderTraverse(LinkBitree Head,StackList pStack)
{
    do
    {
        while(Head)
        {
            pStack->data[pStack->top]=Head;pStack->top=pStack->top+1;//入栈
            Head=Head->Lchild;
        }
        if(pStack->top)
        {
            pStack->top--;Head=pStack->data[pStack->top];//出栈
            printf("%d ",Head->data);
            Head=Head->Rchild;
        }
    }while(pStack->top||Head);
	printf("\n");
}