一个关于二叉树先序非递归创建的代码。。
哎 各位高手求教了 求代码。。先序非递归创建一颗二叉树,,是用C语言写的,,
输入时:AB#D##CE###
这是我弄了一天弄出来的 不知道对不对 各位大哥看看吧
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 5
typedef struct BTNode{
char data;
struct BTNode *lchild,*rchild;
}BTNode,*BTree; //二叉树结构体
typedef struct Tsqstack{
BTree *base;
BTree *top;
int stacksize;
}Tsqstack;//创建时所用到的栈
int Tinitstack(Tsqstack &s) //初始化 栈
{
s.base=(BTree *)malloc(STACK_INIT_SIZE*sizeof(BTNode));
if(!s.base)
return 0;
else
{
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
return 1;
}
int Tpush (Tsqstack &s,BTree &e) //入栈
{
if((s.top-s.base)>=s.stacksize)
{
s.base =(BTree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(BTNode));
if(!s.base) printf("error0");
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return 1;
}
int Tpop (Tsqstack &s,BTree &e) //出栈
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}
BTree Tgettop(Tsqstack &s) //读栈
{
BTree ch;
if(s.top==s.base)
printf("error3");
ch=*(s.top-1);
return ch;
}
BTree CreateTree() //建树
{
char ch[99];
BTNode *head,*p,*t;
Tsqstack s;
int i=0,flag=0,m,j; // flag = 0,创建当前结点的左孩子结点,如果flag = 1,创建当前结点的右孩子结点
printf("字符串长度为");
scanf("%d",&j);
printf("请输入字符");
for(m=0;m<j;m++)
scanf("%c",&ch[m]);
Tinitstack(s);
if(ch=='#') printf("error");
p=(BTNode *)malloc(sizeof(BTNode));
if(p==NULL) printf("error");
p->data=ch; p->lchild=NULL; p->rchild=NULL;
Tpush(s,p);
i++;
head=p;
while(i<j)
{
if(ch=='#'&&flag==1) //当前要创建的结点值为′#′并且flag = 1,说明当前结点的父结点左右孩子结点处理结束,应将栈顶结点出栈。如果出栈的结点依然等于栈顶结点的右孩子,说明当前栈顶结点的左右孩子结点也处理
结束,栈顶结点继续出栈。直到当前栈顶结点的右孩子结点不等于出栈的结点为止
{
Tpop(s,t);
while((Tgettop(s))->rchild==t)
{
Tpop(s,t);
}
}
else if (ch=='#'&&flag==0) //当前要创建的结点值为′#′并且flag =0,则置flag =1,当前结点的左孩子创建结束,转向创建右孩子
flag=1;
else
{
p=(BTNode *)malloc(sizeof(BTNode));
if(p==NULL) return NULL;
p->data=ch; p->lchild=NULL; p->rchild=NULL;
if(flag==0) //当前要创建的结点值不为′#′并且flag = 0,创建当前结点并作为栈顶结点的左孩子,同时将当前结点入栈
{
(Tgettop(s))->lchild=p;
Tpush(s,p);
}
else //当前要创建的结点值不为′#′并且flag = 1,创建当前结点并作为栈顶结点的右孩子,同时将当前结点入栈,然后置flag = 0,转向左孩子结点的创建
{
(Tgettop(s))->rchild=p;
flag=0;
Tpush(s,p);
}
}
i++;
}
return head;
}
void main()
{
BTree T;
T=CreateTree();
}