一、 实验目的
1.掌握树和二叉树的结构特征,以及各种存储结构的特点及适用范围。
2.掌握用指针类型描述、访问和处理二叉树的运算。
二、实验内容
1.输入先序遍历字符序列,建立二叉链表。
2.分别输出先序、中序和后序遍历二叉树的序列(递归算法)。
3.求二叉树的结点个数。
4.输出二叉树的叶子结点。
5.求二叉树的高度。
6.在主函数中设计一个简单的菜单,分别调试上述算法。
说明:
可以通过下面的案例进行程序测试
输入的先序遍历字符序列为:ABC##DE#G##F###(期中’#’代表空树)。建立好的二叉树及二叉链表表示形式如下图所示:
代码内容
#include<iostream>
using namespace std;
typedef char TElemType;
#define OK 1
//二叉树的二叉链表存储表示
typedef struct BiTNode{
TElemType data; //节点数据域
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//使用递归的方法先序遍历建立二叉链表,其中'#'表示空树
void CreateBiTree(BiTree &T){
TElemType ch;
cin>>ch;
if(ch=='#')
T=NULL; //递归出口
else{
T=new BiTNode; //生成根节点
T->data=ch; //树的数据域赋值ch
//(*T).data=ch;
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
}
}
//使用递归中序输出二叉树
void InOrderTraverse(BiTree T){
//树非空就开始递归遍历
if(T){
InOrderTraverse(T->lchild); //中序遍历左子树
cout<<T->data<<" "; //访问根节点
InOrderTraverse(T->rchild); //中序遍历右子树
}
}
//使用递归先序输出二叉树
void PreorderTraverse(BiTree T){
//树非空就开始递归遍历
if(T){
cout<<T->data<<" "; //访问根节点
PreorderTraverse(T->lchild); //先序遍历左子树
PreorderTraverse(T->rchild); //先序遍历右子树
}
}
//使用递归后序输出二叉树
void PostorderTraverse(BiTree T){
//树非空就开始递归遍历
if(T){
PostorderTraverse(T->lchild); //后序遍历左子树
PostorderTraverse(T->rchild); //后序遍历右子树
cout<<T->data<<" "; //访问根节点
}
}
//递归统计二叉树的节点个数
int NodeCount(BiTree T){
if(T)//树非空,节点数为左子树节点数+有右节点数+1
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
//如果树为空,递归结束,节点数为0
return 0;
}
//使用递归计算二叉树的高度
int Depth(BiTree T){
int m,n;//左子树高度m,右子树高度n
//树非空开始计算高度
if(T){
m=Depth(T->lchild); //递归计算左子树高度
n=Depth(T->rchild); //递归计算右子树高度
if(m>n)
return m+1;
return n+1;
}
//树为空
else
return 0;
}
//递归输出所有叶子节点
void PrintLeavers(BiTree T){
//树非空就输出叶子节点
if(T){
if(!T->lchild&&!T->rchild)
cout<<T->data<<" "; //输出叶子节点
PrintLeavers(T->lchild); //递归左子树
PrintLeavers(T->rchild); //递归右子树
}
}
//展示上述功能
void Display(BiTree T){
cout<<" 二叉树程序 "<<endl;
cout<<"------------------"<<endl;
cout<<"按序号输入执行程序"<<endl;
cout<<"1.建立二叉树"<<endl;
cout<<"2.先序遍历二叉树"<<endl;
cout<<"3.中序遍历二叉树"<<endl;
cout<<"4.后序遍历二叉树"<<endl;
cout<<"5.求二叉树节点数"<<endl;
cout<<"6.输出叶子节点" <<endl;
cout<<"7.求二叉树的高度"<<endl;
cout<<"退出程序请按0"<<endl;
cout<<"------------------"<<endl;
int n;
while(OK){
cout<<"请输入要执行的功能"<<endl;
cin>>n;
switch(n){
case 1:
cout<<"输入节点值"<<endl;
CreateBiTree(T); //建立二叉链表
break;
case 2:
cout<<"先序遍历"<<endl;
PreorderTraverse(T); //先序遍历
cout<<endl;
break;
case 3:
cout<<"中序遍历"<<endl;
InOrderTraverse(T); //中序遍历
cout<<endl;
break;
case 4:
cout<<"后序遍历"<<endl;
PostorderTraverse(T); //后序遍历
cout<<endl;
break;
case 5:
cout<<"二叉树节点个数为:"<<NodeCount(T)<<endl; //二叉树结点个数
break;
case 6:
cout<<"二叉树叶子节点如下"<<endl;
PrintLeavers(T); //输出叶子节点
break;
case 7:
cout<<"二叉树高度为:"<<Depth(T)<<endl; //输出二叉树高度
break;
case 0:
exit(0);
}
}
}
int main(){
BiTree T;
Display(T);
return 0;
}
测试结果
总结
这个试验考察的是对二叉树结构的理解,以及对递归方法的使用和理解,如何去定义实现和使用递归函数,这个程序只是简单的使用了二叉树和递归用到的知识还是比较基础的
但,身为菜狗的我…搞了好久才搞懂…