一、实验目的
1.熟练掌握二叉树的二叉链表结构的定义及其递归遍历算法、按层次遍历算法的C语言实现。
2.能深入了解递归算法的执行过程,熟练掌握二叉树递归遍历算法的应用。
3.掌握应用系统的用户界面(“菜单”方式)的设计和操作定义方法
4.培养学生利用二叉树解决实际问题的能力。
二、实验题目
1.设计并验证如下算法:按先序序列建立二叉树的二叉链表结构,求其但反之结点数目,双分支结点数目,并交换二叉树的左、右子树。
三、程序清单
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
typedef struct BiTNode{
char data;
BiTNode *lchild,*rchild;
}BT,*BiTree;
void CreatBiTree(BiTree &BT){ //建立树
char ch;
scanf("%c",&ch);
if(ch=='#')
BT = NULL;
else{
BT = (BiTree)malloc(sizeof(BiTNode));
BT->data = ch;
CreatBiTree(BT->lchild);
CreatBiTree(BT->rchild);
}
}
int Double(BiTree BT){ //计算双分支结点个数
if(BT==NULL)
return 0;
else if(BT->lchild!=NULL&&BT->rchild!=NULL){
return (1+Double(BT->lchild)+Double(BT->rchild));
}
else{
return Double(BT->lchild)+Double(BT->rchild);
}
}
int Single(BiTree BT){ //求单分支结点个数
if(BT==NULL)
return 0;
else if((BT->lchild!=NULL&&BT->rchild==NULL)||(BT->lchild==NULL&&BT->rchild!=NULL)){
return Single(BT->lchild)+Single(BT->rchild)+1;
}
else{
return Single(BT->lchild)+Single(BT->rchild);
}
}
void Change(BiTree T){ //交换左右子树
if(T==NULL)
return;
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
Change(T->lchild);
Change(T->rchild);
}
void Preorder(BiTree T){ //先序遍历二叉树
if(T!=NULL){
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
else
printf("#");
}
int main(){
BiTree BT;
int m,n;
printf("请输入二叉树先序序列,#代表空:\n") ;
CreatBiTree(BT); //测试先序序列:CEI#J##F#GK##H##D##
printf("遍历二叉树后:");
Preorder(BT);
printf("\n");
m = Double(BT);
n = Single(BT);
printf("双分支结点个数为:%d\n",m);
printf("单分支结点个数为:%d\n",n);
Change(BT);
printf("交换左右子树后:");
Preorder(BT);
return 0;
}