实验目的
1.能够用高级语言描述二叉树的二叉链表存储结构;
2.能够用高级语言编写二叉树遍历操作的算法实现。
3.能够将二叉树的递归定义及其遍历操作特点灵活应用于解决二叉树中更复杂的问题。
实验内容
1.创建二叉链表表示的二叉树;
2.实现二叉树的先根、中根和后根遍历操作;
3.利用二叉树的遍历操作实现二叉树的复制、判断两棵二叉树是否相等、求树中叶子结点的个数、求树的深度和查找等操作。
实验要求
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)
{ // 由标明空子树的完整先根遍历序列建立一棵二叉树
char 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 &T,BiTree &dT){//拷贝树
if(T==NULL)
dT=NULL;
else{
dT=(BiTree)malloc(sizeof(BiTNode));
dT->data=T->data;
CopyTree(T->lchild,dT->lchild);
CopyTree(T->rchild,dT->rchild);
}
return OK;
}
int precmp(BiTree T1,BiTree T2)/*用先序遍历方法判断两棵二叉树是否相等*/
{ if (!T1&&!T2)
return 1;
if (T1&&T2)
if (T1->data==T2->data)
if (precmp(T1->lchild,T2->lchild))
if(precmp(T1->rchild,T2->rchild))
return 1;
return 0;
}
void PreRootTraverse(BiTree T) //先根遍历二叉树 T 的递归算法
{
if(T)
{ printf("%c",T->data); //访问根结点
PreRootTraverse(T->lchild); //先根遍历左子树
PreRootTraverse(T->rchild); //先根遍历右子树
}
}
void InRootTraverse(BiTree T) //中根遍历二叉树 T 的递归算法
{
if(T)
{ InRootTraverse(T->lchild); //中根遍历左子树
printf("%c",T->data); //访问根结点
InRootTraverse(T->rchild); //中根遍历右子树
}
}
void PostRootTraverse(BiTree T) //后根遍历二叉树 T 的递归算法
{
if(T)
{ PostRootTraverse(T->lchild); //后根遍历左子树
PostRootTraverse(T->rchild); //后根遍历右子树
printf("%c",T->data); //访问根结点
}
}
int CountLeaf (BiTree T, int & num){//统计叶子结点个数
if ( T ) {
if ((!T->lchild)&& (!T->rchild))
num++; // 对叶子结点计数
CountLeaf( T->lchild, num);
CountLeaf( T->rchild, num);
} // if
return num;
} // CountLeaf
int get_Depth(BiTree T)//返回深度
{
int m,n;
if(T)
{
m=get_Depth(T->lchild);
n=get_Depth(T->rchild);
return m>=n ? m+1:n+1;
}
else
return 0;
}
int Findvalue(BiTree T, char x)//查找元素value并返回其深度
{
int m,n;
if(T)
{
if(T->data==x){
printf("找到该元素%c,该节点深度为:%d",x,get_Depth(T));
return get_Depth(T);}
else
{
m=Findvalue(T->lchild, x);
n=Findvalue(T->rchild, x);
return m>n ? m:n;
}
}
else return 0;
}
int main() //主函数
{ BiTree T=NULL; int x;
BiTree dT=NULL;
int num=0;//统计叶子结点个数
char value;
while(1)
{
printf("/---------------二叉树菜单---------------/\n");
printf(" 1-建立二叉树\n");
printf(" 2-复制二叉树\n");
printf(" 3-判断两棵二叉树相等\n");
printf(" 4-求二叉树的叶子结点个数\n");
printf(" 5-求二叉树的深度\n");
printf(" 6-查找\n");
printf(" 7-退出\n");
printf("/---------------二叉树菜单---------------/\n");
printf("please input the choose!(1-7):"); //请求选择遍历方式
scanf("%d",&x);
switch(x)
{ case 1: printf("please input Preorder with #:");
getchar();
CreateBiTree(T);
printf("先根遍历值为:");
PreRootTraverse(T); //调用先根遍历二叉树函数
printf("\n");
printf("中根遍历值为:");
InRootTraverse(T);
printf("\n");
printf("后根遍历值为:");
PostRootTraverse(T);
break;
case 2: CopyTree(T,dT);
printf("拷贝树成功\n");
printf("拷贝树先根遍历值为:");
PreRootTraverse(dT); //调用先根遍历二叉树函数
printf("\n");
printf("拷贝树中根遍历值为:");
InRootTraverse(dT);
printf("\n");
printf("拷贝树后根遍历值为:");
PostRootTraverse(dT);
break;
case 3: if(precmp(T,dT))
printf("两棵树相同\n");
break;
case 4: printf("你所输入的二叉树的叶子结点个数为%d\n",CountLeaf(T,num));
break;
case 5: printf("你所输入的二叉树深度为%d\n",get_Depth(T));
break;
case 6: printf("请输入要查找的字符:");
getchar();
scanf("%c",&value);
Findvalue(T,value);
break;
case 7: printf("退出成功\n");
return 0;
default:printf("ERROR!\n");
}
printf("\n");
}
return 1;
}
运行结果
如果有帮助的话就点个赞吧(ง •_•)ง