要求实现二叉树的基本运算,如创建二叉树、求树的高度,树的遍历。
二叉树结构定义如下:
typedef char ElemType;
typedef struct node
{
ElemType data; //数据元素
struct node *lchild; //指向左孩子
struct node *rchild; //指向右孩子
} BTNode;
函数接口定义:
void CreateBTNode(BTNode *&b,char *str); //根据括号表示法的str,创建二叉树b。
int BTNodeDepth(BTNode *b); //求二叉树b的深度。
void PreOrder(BTNode *b); //先序遍历二叉树b
void InOrder(BTNode *b); //中序遍历二叉树b
void PostOrder(BTNode *b); //后序遍历二叉树b
void TravLevel(BTNode *b); //层次遍历二叉树b
void DestroyBTNode(BTNode *&b); //销毁二叉树b。 (由裁判程序实现,略去)
注意:输出遍历序列时,每个结点字符之后均有空格符。
裁判测试程序样例:
int main()
{
BTNode *b,*p,*lp,*rp;
char str[100];
scanf("%s",str);
CreateBTNode(b,str); //括号表示法创建二叉树
printf("Depth:%d\n",BTNodeDepth(b));
printf("PreOrder: ");
PreOrder(b); //先序遍历
printf("\n");
printf("InOrder: ");
InOrder(b); //中序遍历
printf("\n");
printf("PostOrder: ");
PostOrder(b); //后序遍历
printf("\n");
printf("TravLevel: ");
TravLevel(b); //层次遍历
DestroyBTNode(b); //释放二叉树b
return 0;
}/* 请在这里填写答案 */
输入样例:
A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
输出样例:
Depth:7
PreOrder: A B D E H J K L M N C F G I
InOrder: D B J H L K M N E A F C G I
PostOrder: D J L N M K H E B F I G C A
TravLevel: A B C D E F G H I J K L M N
代码实现:
void CreateBTNode(BTNode *&b,char *str)
{
BTNode *S[100],*p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':top++;S[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else{
switch(k)
{
case 1:S[top]->lchild=p;break;
case 2:S[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
int BTNodeDepth(BTNode *b){
int llength,rlength;
if(b==NULL) return 0;
else{
llength=BTNodeDepth(b->lchild);
rlength=BTNodeDepth(b->rchild);
}
return llength>rlength?(llength+1):(rlength+1);
}
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
printf("%c ",b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
void InOrder(BTNode *b)
{
if(b!=NULL)
{
InOrder(b->lchild);
printf("%c ",b->data);
InOrder(b->rchild);
}
}
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c ",b->data);
}
}
void TravLevel(BTNode *b){
BTNode *a[100];
int i=0,j=0;
a[0]=b;
while(b){
BTNode *p=a[j];
printf("%c ",p->data);
if(p->lchild)
a[++i]=p->lchild;
if(p->rchild)
a[++i]=p->rchild;
if(i==j) break;
j++;
b=a[j];
}
}