|
在VC8的环境下运行,无论输入什么,输出的结果只有一个,就是"是空树",请大家帮我看下,感激不尽,或者大家之前有编过类似的程序,可以贴出来让我参考一下,再次感谢
#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"
#include "string"
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define NULL 0
#define MAXLEN 50
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;//定义结点
Status PrintElement( TElemType e )
{
printf("%c",e);
return OK;
}//对结点的访问,暂时为printf
Status PreOrderTraverse( BiTree T, Status (* Visit)(TElemType e) )
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
return OK;
return ERROR;
}
else return OK;
}//先序遍历
Status InOrderTraverse( BiTree T, Status (* Visit)(TElemType e) )
{
if(T)
{
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit))
return OK;
return ERROR;
}
else return OK;
}//中序遍历
Status PostOrderTraverse( BiTree T, Status (* Visit)(TElemType e) )
{
if(T)
{
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data))
return OK;
return ERROR;
}
else return OK;
}//后序遍历
Status Search(TElemType ino[], TElemType e, int is, int n)
{
int k, b;
for(b=is; b<n; b++)
if(ino == e)
k = b;
if(b == n)
k = -1;
return k;
}//依次对比ino[]中各元素,找出与pre[ps]相乘的,并返回其下标,即k的值
void CrtBT(BiTree &T, TElemType pre[], TElemType ino[], int ps, int is, int n )
{
// 已知pre[ps..ps+n-1]为二叉树的先序序列,
// ino[is..is+n-1]为二叉树的中序序列,本算
// 法由此两个序列构造二叉链表
int k;
if (n == 0)
T = NULL;
else
{
k = Search(ino, pre[ps], is, n); // 在中序序列中查询前序中的第一个结点
if (k == -1)
T = NULL;
else
{
T = (BiTNode*)malloc(sizeof(BiTNode));
T->data = pre[ps];
if (k == is) //刚好是ino的第一个元素
T->lchild = NULL;
else
CrtBT(T->lchild, pre, ino, ps+1, is, k-is );//(k-is)是其左子树的长度
if (k = is+n-1)//刚好是ino的最后一个元素
T->rchild = NULL;
else
CrtBT(T->rchild, pre, ino, ps+1+(k-is), k+1, n-(k-is)-1);//ps+1+(k-is)是其右子树的根结点,n-(k-is)-1是右子树的长度
}//else
} //else
} // CrtBT
int main()
{
BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
TElemType pre[MAXLEN], ino[MAXLEN];//pre为先序序列,ino为中序序列
int ps = 0, is = 0;//pre为先序序列的下标,is为中序序列的下标
int LEN;
printf("请输入先序序列:\n");
scanf("%s",pre);
printf("\n请输入中序序列:\n");
scanf("%s",ino);
LEN = strlen(pre);//输入字符串的长度
CrtBT(T, pre, ino, ps, is, LEN);
if(T)//树非空
{
printf("\n建完树后,其先序序列为:\n");
PreOrderTraverse(T, PrintElement);
printf("\n其中序序列为:\n");
InOrderTraverse(T, PrintElement);
printf("\n其后序序列为:\n");
PostOrderTraverse(T, PrintElement);
printf("\n");
}
else
printf("\n是空树!");
return OK;
} |
|