借助栈实现二叉树中序遍历

#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");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值