该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
刚好我也在做这个作业,借你一用,你自己最好还是好好研究下吧,还是自己写这样才有进步的。
#include
#include
#include
#define M 30
typedef char Elemtype;
typedef struct BiTNode {
Elemtype data;
struct BiTNode *LChild,*RChild;
}BiTNode;
BiTNode* s[M]; //作为储存根结点的指针使用
//初始化二叉树
void InitBTree(BiTNode **T)
{
*T=NULL; //把树根指针置空
}
//按用户的输入创建二叉树
void createbitree(BiTNode **T,char *a)
{
int k; //作为判断左右子树的标记
int i=0; //树组a的下 标
int top=0; //指示S数组,初值为-1,表示空的
BiTNode *p;
*T=NULL;
while (a[i]!='\0')
{
switch (a[i]) {
case ' ':
break; //对空格什么也不做
case '(':
if (top==M-1) {
printf("数组太小,请增加M\n");
exit (1);
}
top++;s[top]=p;k=1;
break;
case ')' :
if (top==-1) {
printf("输入格式错误!\n");
exit (1);
}
top--;
break;
case ',':
k=2; //开始右子树
break;
default:
p=(BiTNode *) malloc (sizeof(BiTNode));
p->data=a[i];
p->LChild = p->RChild =NULL;
if (*T==NULL) *T=p; //第一个结点作为树根
else {
if (k==1)
s[top]->LChild=p;
else
s[top]->RChild=p;
}
break;
}
i++; //扫描下一个字符
}
}
//清空二叉树
void cleartree(BiTNode **T)
{
if (*T!=NULL) {
cleartree(&((*T)->LChild));
cleartree(&((*T)->RChild));
free(*T);
*T=NULL;
}
}
//检查二叉数是否为空
int treeempty(BiTNode *T)
{
if (T!=NULL)
return 1;
else
return 0;
}
//递归前序遍历
void preorder(BiTNode *T)
{
if (T!=NULL) {
printf("%c ",T->data); //先访问根结点
preorder(T->LChild); //遍历左子树
preorder(T->RChild); //遍历右子树
}
}
//递归后序遍历
void postorder(BiTNode *T)
{
if (T!=NULL) {
postorder(T->LChild); //遍历左子树
postorder(T->RChild); //遍历右子树
printf("%c ",T->data); //后访问根结点
}
}
//中序非递归遍历
void inorder(BiTNode *T)
{
int top=1;
//BiTNode* s[M]; //S作为存结点的栈使用
BiTNode *p;
s[top]=T;
while (top!=0) {
p=s[top];
while( s[top]!=NULL&&p!=NULL ) { // 向左走到尽头
s[++top]=p->LChild;
p=p->LChild;
}
top--; //空指针退栈
if (top!=0) { //访问结点,向右走一步
printf("%c ",s[top]->data);
s[top]=s[top]->RChild;
}
}
}
//按层次遍历树
void levelorder(BiTNode *T)
{
BiTNode *p;
int front=0,rear=0; //利用BiTnode *s[m],当队列用
if (T!=NULL) { //树根入队列
rear = (rear+1)%M; //第一层是根,先访问,所以它是队头
s[rear]=T;
}
while (rear!=front) {
front=(front+1)%M;
p=s[front]; //删除队头元素(下一步队头指向front+1,会被覆盖)
printf("%c ",p->data); //输出队头元素所指的结点值
if (p->LChild!=NULL) {
rear=(rear+1)%M; //如果有左孩子,那就入队
s[rear]=p->LChild;
}
if (p->RChild!=NULL) {
rear=(rear+1)%M; //如果有右孩子,那就入队
s[rear]=p->RChild;
}
}
}
//求二叉数的深度
int deeptree(BiTNode *T)
{
if (T==NULL) return 0;
if (T->LChild==NULL&&T->RChild==NULL) return 1;
if (deeptree(T->LChild)>deeptree(T->RChild))