一、操作要求
1.假设二叉树的结点值是字符,先根据输入一棵二叉树标明空子树的完整先根遍历序列或者根据输入一棵二叉树的先根遍历序列和中根遍历序列或者根据输入一棵二叉树的后根遍历序列和中根遍历序列,建立一棵以二叉链表表示的二叉树,并输出建立后的二叉树的先根、中根、后根遍历序列,观察其建立的二叉树是否正确;
2.复制上述建立的二叉树,并输出复制后的二叉树的后根遍历序列,观察其复制操作是否正确;
3.判断复制后形成的二叉树是否与原二叉树相等,如果相等,则报告“这两棵树是相等的,复制操作成功”,否则报告“这两棵树是不相等的,复制操作不成功”;
4.求出其中一棵树中叶子结点的个数并输出其值;
5.求出其中一棵树中的深度并输出其值;
6.输入一个指定的字符x,在指定的一棵二叉树中查找值为x的结点,如果查找成功,则输出“OK”,否则输出“ERROR”;
7.主程序中要求设计一个菜单,允许用户通过菜单来选择依次选择执行“建立一棵二叉树”、“复制二叉树”、“判断两棵二叉树相等”、“求二叉树的叶子结点个数”、“求二叉树的深度”和“查找”等操作。
二、代码实现
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreateBiTree(BiTree &T){
TElemType ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
//标明空子树的完整先根遍历序列,建立二叉链表示二叉树
Status CopyTree(BiTree T1,BiTree &T2){
if(T1){
T2=(BiTree)malloc(sizeof(BiTNode));
if(!T2)
return ERROR;
T2->data=T1->data;
CopyTree(T1->lchild,T2->lchild);
CopyTree(T1->rchild,T2->rchild);
}
else
T2=NULL;
return OK;
} //复制
Status IsEqual(BiTree T1,BiTree T2) {
if(T1==NULL&&T2==NULL)
return ERROR;
if(T1!=NULL&&T2!=NULL)
if(T1->data==T2->data)
if(IsEqual(T1->lchild,T2->lchild));
if(IsEqual(T1->rchild,T2->rchild));
return OK;
return ERROR;
}//判断两棵树是否相等
int Countleaf(BiTree T,int &num){
if(T!=NULL){
if((T->lchild==NULL)&&(T->rchild==NULL))
num++;
Countleaf(T->lchild,num);
Countleaf(T->rchild,num);
}
return num;
} //求出叶子节点
int Depth(BiTree T){
int Depthleft,Depthright,h;
if(T!=NULL){
Depthleft=Depth(T->lchild);
Depthright=Depth(T->rchild);
h=1+(Depthleft>=Depthright?Depthleft:Depthright);
}
else
h=0;
return h;
}//求一棵树的深度
Status SearchNode(BiTree &T,char x){
if(T!=NULL){
if(T->data==x)
return OK;
else
return (SearchNode(T->lchild,x)!=ERROR?SearchNode(T->lchild,x):SearchNode(T->rchild,x));
}
return ERROR;
} //查找x值
void PreRootTraverse(BiTree T){
if(T!=NULL){
printf("%c",T->data);
PreRootTraverse(T->lchild);
PreRootTraverse(T->rchild);
}
}//先根遍历
void InRootTraverse(BiTree T){
if(T!=NULL){
InRootTraverse(T->lchild);
printf("%c",T->data);
InRootTraverse(T->rchild);
}
}//中根遍历
void PostRootTraverse(BiTree T) {
if(T!=NULL){
PostRootTraverse(T->lchild);
PostRootTraverse(T->rchild);
printf("%c",T->data);
}
}//后根遍历
int main(){
BiTree T=NULL;
BiTree T2=NULL;
char x;
int num=0;
int a;
while(1){
printf("1--建立一棵二叉树\n");
printf("2--复制二叉树\n");
printf("3--判断两棵二叉树相等\n");
printf("4--求二叉树的叶子结点个数\n");
printf("5--求二叉树的深度\n");
printf("6--查找\n");
printf("请选择需要执行的功能(1-6):\n");
scanf("%d",&a);
switch(a){
case 1:
printf("建立一棵二叉树\n");
printf("请输入树中元素:(输入#为空)\n");
getchar();//从键盘读入字符时,必须等到输入换行(按Enter键)才能读取
CreateBiTree(T);
printf("先根遍历为:");
PreRootTraverse(T);
printf("\n");
printf("中根遍历为:");
InRootTraverse(T);
printf("\n");
printf("后根遍历为:");
PostRootTraverse(T);
printf("\n");
break;
case 2:
CopyTree(T,T2);
printf("复制后新二叉树的后根序列为:\n");
PostRootTraverse(T2);
printf("\n");
break;
case 3:
if(IsEqual(T,T2)){
printf("这两棵树是相等的,复制操作成功\n");
}
else
printf("这两棵树是不相等的,复制操作不成功\n");
printf("\n");
break;
case 4:
printf("该二叉树叶子节点个数为:%d\n",Countleaf(T,num));
printf("\n");
break;
case 5:
printf("该二叉树的深度为:%d\n",Depth(T));
break;
case 6:
printf("请输入要查找的字符x:\n");
getchar();
scanf("%c",&x);
if(SearchNode(T,x)){
printf("OK\n");
}
else
printf("ERROR\n");
break;
case 7: return 0;
default: printf("ERROR\n");
}
printf("\n");
}
return 1;
}
三、运行结果