非递归先序遍历二叉树(2)

/*非递归先序遍历二叉树*/
#include<stdio.h>
#define maxsize 100
typedef char datatype;
/*二叉链表类型定义*/
typedef struct Binnode
{
    datatype data;                   /*数据域*/
    struct BinNode* lchild,*rchild;  /*指向左、右孩子的指针*/
}BinNode,*Bintree;
/*顺序栈类型定义*/
typedef struct
{
    Bintree data[maxsize];            /*存储栈中数据元素*/
    int top;                          /*标志栈顶位置*/
}SeqStk;
/*初始化栈*/
int InitStack(SeqStk *stk)
{
    stk->top=0;
    return 1;
}
/*判栈空*/
int EmptyStack(SeqStk *stk)
{
    if(stk->top==0)                   /*若栈为空,则返回值1,否则返回0.*/
        return 1;
    else
        return 0;
}
/*入栈*/
int Push(SeqStk *stk,Bintree x)
{
   if(stk->top==maxsize-1)                      /*判断栈是否满*/
   {
       printf("栈满\n");
       return 0;
   }
   else
   {
       stk->top++;                              /*栈未满,top值加1.*/
       stk->data[stk->top]=x;                   /*元素x进栈*/
       return 1;

   }
}
/*出栈*/
int Pop(SeqStk *stk)
{
    if(EmptyStack(stk))                         /*判断是否下溢(栈空)*/
    {
        printf("下溢\n");
        return 0;
    }
    else                                        /*未下溢,栈顶元素出栈。*/
    {
        stk->top--;                             /*top值减1*/
        return 1;
    }
}
/*取栈顶数据元素,栈顶数据元素通过参数返回。*/
Bintree GetTop(SeqStk *stk)
{
    if(EmptyStack(stk))
        printf("栈空\n");                        /*栈空,返回NULLData.*/
    else
        return stk->data[stk->top];             /*返回栈顶数据元素*/
}
/*按先序创建二叉树*/
Bintree CreateTree(Bintree T)
{
    datatype ch;
    scanf("%c",&ch);
    if(ch=='#')
        return NULL;
    else
    {
        T=(Bintree)malloc(sizeof(BinNode));
        T->data=ch;
        T->lchild=CreateTree(T->lchild);/*创建左子树*/
        T->rchild=CreateTree(T->rchild);/*创建右子树*/
        return T;
    }
}

/*非递归先序遍历二叉树*/
void preorder(Bintree T)
{
    Bintree p;
    SeqStk s;
    InitStack(&s);
    p=T;
    while(p || !EmptyStack(&s))
    {
        if(p)
        {
            printf("%c ",p->data);      /*访问当前结点*/
            Push(&s,p);                 /*当前结点指针入栈*/
            p=p->lchild;                /*当前指针指向左孩子*/
        }
        else
        {
            p=GetTop(&s);               /*栈顶元素退栈*/
            Pop(&s);
            p=p->rchild;                /*当前指针指向右孩子*/
        }
    }
}
main()
{
    Bintree t;
    printf("请按先序的方式输入二叉树的结点元素(注:#表示节点为空):");
    t=CreateTree(t);
    printf("非递归先序遍历二叉树:");
    preorder(t);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻58

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值