数据结构实验指导书实验5
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五二叉树操作
一、实验目的
1.进一步掌握指针变量的含义。
2.掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3.掌握用指针类型描述、访问和处理二叉树的运算。
二、实验内容
示例程序1:广义表建立的二叉树(BTree1.cpp)
本示例程序定义了二叉树的二叉链表存储结构,并根据输入的二叉树广义表建立二叉树,实现了如下基本操作:建立(输入二叉树广义表,建立对应的二叉树存储结构)、遍历(先序遍历,中序遍历,后序遍历,按层遍历)、求二叉树所有结点数等。
程序代码如下:
#include
#include
#include
#include
#include
#define OK 1
#define TRUE 1
#define FALSE 0
#define NULL 0
#define OVERFLOW -1
typedef char ElemType; // 定义ElemType为char类型
//定义二叉树结点类型
typedef struct BTreeNode
{ ElemType data;
struct BTreeNode *left,*right;/*左右孩子指针*/
}BTreeNode,*BTree;
//二叉树基本操作说明
//初始化二叉树,即把树根指针置空
void InitBTree(BTree &T);
//根据存于字符数组a的二叉树广义表,建立对应的二叉树存储结构
//判断二叉树是否为空
bool BTreeEmpty(BTree T);
//按任意一种遍历次序输出二叉树中的所有结点
void TraverBTree(BTree T,int mark);
//求二叉树中所有结点数
int BTreeCount(BTree T);
//按照二叉树的一种表示方法输出整个二叉树
void PrintBTree(BTree T);
//清除二叉树,使之变成一棵空树
void ClearBTree(BTree &T);
//二叉树基本操作的实现
//初始化二叉树,即把树根指针置空
void InitBTree(BTree &T)
{T=NULL;}
//根据存于字符数组a的二叉树广义表,建立对应的二叉树存储结构void CreateBTree(BTree &T,char *a)
{BTree s[10];//s数组作为存储二叉树中根结点指针的栈
int top=-1; //top作为s栈的栈顶指针
T=NULL; //将树根指针置空
BTree p; //定义p为指向二叉树结点的指针
int k; //用k作为处理结点的左子树和右子树的标记,
//k=1处理左子树,k=2处理右子树
istrstream ins(a);//把字符串a定义为输入字符串流对象ins
char ch;
ins>>ch; //从ins流对象顺序读入一个字符
while(ch!='@')
{//每循环一次处理一个读入的字符,直到扫描到'@'字符为止
switch(ch)
{case '(':top++;s[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=new BTreeNode;
p->data=ch;
p->left=p->right=NULL;
if(T==NULL) T=p;
else {
if(k==1) s[top]->left=p;
else s[top]->right=p;
}
}
ins>>ch;
}
}
//判断二叉树是否为空
bool BTreeEmpty(BTree T)
{return T==NULL;}
//按任意一种遍历次序输出二叉树中的所有结点
void TraverBTree(BTree T,int mark)
{if(mark==1)//先序遍历
{if(T!=NULL)
{cout<
TraverBTree(T->left,mark);
TraverBTree(T->right,mark);
}
}
else if(mark==2)//中序遍历
{if(T!=NULL)
{TraverBTree(T->left,mark);
cout<
TraverBTree(T->right,mark);
}
}
else if(mark==3)//后序遍历
{if(T!=NULL)
{TraverBTree(T->left,mark);
TraverBTree(T->right,mark);
cout<
}
}
else if(mark==4)//按层遍历
{const MaxLength=30;
//定义存储二叉树结点指针的数组空间作为队列使用