输入二叉树的广义表形式,将其转变为二叉树形式,至于怎样输入广义表需要程序规定。
定义包含头文件文件t11.h中
#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h" //atoi(),exit();
#include"io.h" //eof()
#include"math.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;
定义数据结构头文件gercs.h中
#define INIT_STACK 100
#define INIT_STACK_ADD 20
typedef struct node // 二叉树的数据结构定义
{
char data;
struct node *lchild;
struct node *rchild;
}*Bitree,pBitree;
typedef struct
{
char *bottom;
char *top;
int stacksize;
}Sqstack;
struct Binode
{
Bitree lp;
};
struct Sqstack1
{
Binode *bottom;
Binode *top;
int stacksize;
};
typedef struct
{
Binode *front;
Binode *rear;
int queuesize;
}*linkqueue,queue;
Sqstack W;
定义包含实现函数功能模块gercs.cpp中
void inittree(Bitree &T)
{
T=NULL;
}
void initqueue(queue &Q)
{
Q.front=(Binode*)malloc(INIT_STACK*sizeof(Binode));
Q.rear=Q.front;
Q.queuesize=INIT_STACK;
}
void initstack(Sqstack &L)
{
L.bottom=(char*)malloc(INIT_STACK*sizeof(char));
if(!L.bottom)
{
printf("内存分配失败!!");
exit(0);
}
L.top=L.bottom;
L.stacksize=INIT_STACK;
}
void initstack1(Sqstack1 &L)
{
L.bottom=(Binode*)malloc(INIT_STACK*sizeof(Binode));
if(!L.bottom)
{
printf("内存分配失败!!");
exit(0);
}
L.top=L.bottom;
L.stacksize=INIT_STACK;
}
void enqueue(queue &Q,Bitree T)
{
if(Q.rear-Q.front > Q.queuesize)
{
Q.front=(Binode*)realloc(Q.front,(Q.queuesize,INIT_STACK_ADD)*sizeof(Binode));
Q.rear=Q.front+Q.queuesize;
Q.queuesize+=INIT_STACK_ADD;
}
(Q.rear++)->lp=T;
}
void push(Sqstack &L,char ch)
{
if(L.top-L.bottom > L.stacksize)
{
L.bottom=(char*)realloc(L.bottom,(L.stacksize+INIT_STACK_ADD)*sizeof(char));
L.top=L.bottom+L.stacksize;
L.stacksize+=INIT_STACK_ADD;
}
*(L.top++)=ch;
}
void push1(Sqstack1 &L,Bitree ch)
{
if(L.top-L.bottom > L.stacksize)
{
L.bottom=(Binode*)realloc(L.bottom,(L.stacksize+INIT_STACK_ADD)*sizeof(Binode));
L.top=L.bottom+L.stacksize;
L.stacksize+=INIT_STACK_ADD;
}
(L.top++)->lp=ch;
}
Status pop(Sqstack &L,char &e)
{
if(L.bottom == L.top)
return ERROR;
else
{
e=*(--L.top);
return OK;
}
}
Status pop1(Sqstack1 &L,Bitree &e)
{
if(L.bottom == L.top)
return ERROR;
else
{
e=(--L.top)->lp;
return OK;
}
}
Status emptystack(Sqstack L)
{
if(L.bottom == L.top)
return OK;
else
return ERROR;
}
Status emptystack1(Sqstack1 L)
{
if(L.bottom == L.top)
return OK;
else
return ERROR;
}
Sqstack shuru(Sqstack &S)
{
Sqstack R;
initstack(R);
char ch,ch1;
printf("输入广义表二叉树形式:");
ch=getchar();
while(10 != ch)
{
if(ch >= 'a' && ch <= 'z')//|| ch >= 'A' && ch <='Z')
{
push(S,ch);
ch1=getchar();
if(')' == ch1)
{
push(S,10);
push(S,10);
}
ch=ch1;
}
else
{
ch1=getchar();
if(',' == ch && ',' == ch1)
push(S,10);
ch=ch1;
}
}
while(!emptystack(S))
{
pop(S,ch);
//printf("%-3c",ch);
push(R,ch);
}
return R;
}
void Createtree(Bitree &T) // 先序创建二叉树
{
// printf("进入了!");
char ch;
pop(W,ch);
// printf("ch=%c ",ch);
if(ch == 10) // 如果是回车键置为空
T=NULL;
else
{
T=(Bitree)malloc(sizeof(pBitree));
if(!T)
{
printf("分配失败!");
exit(0);
}
T->data=ch;
Createtree(T->lchild);
Createtree(T->rchild);
}
// getchar();
} // 创建二叉树结束
void xianxu(Bitree T,Sqstack1 &S) // 先序非递归遍历,采用的是保存右孩子的地址通过栈实现
{
printf("先序非递归遍历输出:\n");
if(T)
{
if(T->rchild)
push1(S,T->rchild); // 专门压入右孩子指针地址
printf("%-3c",T->data);
T=T->lchild; // 更新指针
}else
exit(0);
while(T || !emptystack1(S)) // 循环终止条件
{
if(T!= NULL) // 始终作为一个点存在加以判断,一种情况是一直指向左孩子,另一种就是出栈弹出的右孩子
{
printf("%-3c",T->data); // 输出节点的数据域
if(T->rchild != NULL) // 该节点存在右孩子,将右孩子入栈
push1(S,T->rchild);
T=T->lchild; // 更新指针,始终往左走
}
else
pop1(S,T);
}
}
void cengci(Bitree T,queue &Q)
{
if(!T)
{
printf("树为空!");
exit(0);
}
Binode *P,*S;
S=P=Q.front;
enqueue(Q,T);
while(P != Q.rear)
{
if(P->lp->lchild)
enqueue(Q,P->lp->lchild);
if(P->lp->rchild)
enqueue(Q,P->lp->rchild);
P++;
}
printf("层次遍历为:\n");
while(S < Q.rear)
{
printf("%-3c",S->lp->data);
S++;
}
}
最后就是定义主函数函数调用了,包含于头文件main_gercs.cpp中
#include"t11.h"
#include"gercs.h"
#include"gercs.cpp"
void main()
{
// char ch;
Bitree S;
queue U;
Sqstack1 Q;
initstack(W);
initstack1(Q);
inittree(S);
initqueue(U);
W=shuru(W);
/* while(!emptystack(W))
{
pop(W,ch);
printf("%-3c",ch);
}*/
Createtree(S);
xianxu(S,Q);
printf("\n");
cengci(S,U);
printf("\n");
}
程序的注释由于自己刚编写的,没有及时加上,等自己有时间加上详细注释,现在做了这么多得实验,发现学了数据结构,不仅自己对语言的熟练程度变得更深了,而且编程思想和以前完全不一样了,程序的设计很快就可以完成。遇到的困难也会解决,相信只要自己不断深入学习对这方面的理解就会变得更深刻。自己也是一个意志坚强的男孩,只要有困难一定会有解决的办法。留住最真的于2012.04.25.18:46写。~~~~~~~~~~~~~~~~~~~~~~~~~~~