#include<stdlib.h>
#include<stdio.h>
#define STACK_INIT_SIZE 100//栈初始分配的空间数
#define STACKINCREAMENT 10//栈空间不够时增加的空间数
typedef char eletype;//二叉树结点信息类型
typedef struct BiTNode//二叉树结点类型
{
struct BiTNode *lchild,*rchild;
eletype data;
}BiTNode;
typedef BiTNode *elemtype;//elemtype声明为指针类型
typedef struct stack//栈的存储类型,采用动态分配
{
elemtype *base;
elemtype *top;
int stacksize;
}sqstack;
sqstack *initstack()//创建栈
{
sqstack *s;
if (!(s = (sqstack *)malloc(sizeof(sqstack))))exit(-1);
s->base = (elemtype *)malloc(STACK_INIT_SIZE*sizeof(elemtype));//初始化为栈分配STACK_INIT_SIZE个elemtype类型的空间
if (!s->base)//分配空间失败
{
exit(-2);
printf("栈空间分配失败!/n");
}
if (s->base)//分配空间成功
printf("栈空间分配成功!/n");
s->top = s->base;//初始化栈的头尾指针
s->stacksize = STACK_INIT_SIZE;
return s;
}
void push(sqstack *s,elemtype e)//压栈,e要是一个地址
{
if (s->top-s->base>=s->stacksize)//栈满
{
s->base = (elemtype *)realloc(s->base,(s->stacksize+STACKINCREAMENT)*sizeof(elemtype));//栈满时增加空间
if (!s->base)//增加分配空间失败
exit(-2);
s->stacksize += STACKINCREAMENT;
}
*(s->top) = e;
s->top++;
}
elemtype pop1(sqstack *s)//出栈1,返回的e为栈顶元素是一个地址
{
elemtype e;
if (s->top == s->base)return 0;//栈空时返回
s->top--;
e = *(s->top);
return e;
}
int stackempty(sqstack *s)//判断栈空,栈空返回1,否则返回0
{
if (s->base == s->top)return 1;
else return 0;
}
BiTNode *CreateBiTree()//先序递归法建树
{
char x;
BiTNode *t;
scanf("%c",&x);
if (x == ' ')t = NULL;
else
{
if (!(t = (BiTNode *)malloc(sizeof(BiTNode))))exit(-1);
t->data = x;//建立节点
t->lchild = CreateBiTree();//建左子树
t->rchild = CreateBiTree();//建右子树
}
return t;
}
int InOrder(BiTNode *t)//中序遍历二叉树非递归算法
{
sqstack *s;
BiTNode *p;
s = initstack();//初始化栈
p = t;
printf("中序遍历二叉树,字符序列为:/n");
while (p||!stackempty(s))
{
while (p)//找最左结点
{
push(s,p);
p = p->lchild;//p指针顺lchild而下
}
p = pop1(s);//栈顶元素出栈以访问最左结点
printf("%c",p->data);//访问最左结点
p = p->rchild;
}
printf("/n");
return 1;
}
void main()
{
BiTNode *t;
printf("请输入建树字符序列,以空格表示NULL:/n");
t = CreateBiTree();
InOrder(t);
}
本文来自CSDN博客,出处:http://blog.csdn.net/rainer7/archive/2004/08/10/70671.aspx