一、 实验目的
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;
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)
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
return 0;
}
int Depth(BiTree T){
int 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);
}
}
}
main(){
BiTree T;
Display(T);
}
测试结果
总结
这个试验考察的是对二叉树结构的理解,以及对递归方法的使用和理解,如何去定义实现和使用递归函数,这个程序只是简单的使用了二叉树和递归用到的知识还是比较基础的 但,身为菜狗的我…搞了好久才搞懂…
|