数据结构实验报告(四)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
班级:
学号:
姓名:
实验四二叉树的基本操作实验环境:Visual C++
实验目的:
1、掌握二叉树的二叉链式存储结构;
2、掌握二叉树的建立,遍历等操作。
实验内容:
通过完全前序序列创建一棵二叉树,完成如下功能:
1)输出二叉树的前序遍历序列;
2)输出二叉树的中序遍历序列;
3)输出二叉树的后序遍历序列;
4)统计二叉树的结点总数;
5)统计二叉树中叶子结点的个数;
实验提示:
//二叉树的二叉链式存储表示
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
一、程序源代码
#include
#include
#define MAXSIZE 30
typedef char ElemType;
typedef struct TNode *BiTree;
struct TNode {
char data;
BiTree lchild;
BiTree rchild;
};
int IsEmpty_BiTree(BiTree *T) { if(*T == NULL)
return 1;
else
return 0;
}
void Create_BiTree(BiTree *T){
char ch;
ch = getchar();
//当输入的是"#"时,认为该子树为空
if(ch == '#')
*T = NULL;
//创建树结点
else{
*T = (BiTree)malloc(sizeof(struct TNode)); (*T)->data = ch; //生成树结点
//生成左子树
Create_BiTree(&(*T)->lchild);
//生成右子树
Create_BiTree(&(*T)->rchild);
}
}
void TraverseBiTree(BiTree T) { //先序遍历
if(T == NULL)
return;
else {
printf("%c ",T->data);
TraverseBiTree(T->lchild);
TraverseBiTree(T->rchild);
}
}
void InOrderBiTree(BiTree T) { //中序遍历if(NULL == T)
return;
else {
InOrderBiTree(T->lchild);
printf("%c ",T->data);
InOrderBiTree(T->rchild);
}
}
void PostOrderBiTree(BiTree T) {
if(NULL == T)
return;
else {
InOrderBiTree(T->lchild);
InOrderBiTree(T->rchild);
printf("%c ",T->data);
}
}
int TreeDeep(BiTree T) {
int deep = 0;
if(T)
{
int leftdeep = TreeDeep(T->lchild);
int rightdeep = TreeDeep(T->rchild);
deep = leftdeep+1 > rightdeep+1 ? leftdeep+1 : rightdeep+1;
}
return deep;
}
int Leafcount(BiTree T, int &num) {
if(T)
{
if(T->lchild ==NULL && T->rchild==NULL)
{
num++;
printf("%c ",T->data);
}
Leafcount(T->lchild,num);
Leafcount(T->rchild,num);
}
return num;
}
void LevelOrder_BiTree(BiTree T){
//用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现 int front = 0;
int rear = 0;
BiTree BiQueue[MAXSIZE];
BiTree tempNode;
if(!IsEmpty_BiTree(&T)){
BiQueue[rear++] = T;
while(front != rear){
//取出队头元素,并使队头指针向后移动一位
tempNode = BiQueue[front++];
//判断左右子树是否为空,若为空,则加入队列 if(!IsEmpty_BiTree(&(tempNode->lchild))) BiQueue[rear++] = tempNode->lchild;
if(!IsEmpty_BiTree(&(tempNode->rchild))) BiQueue[rear++] = tempNode->rchild;
printf("%c ",tempNode->data);
}
}
}
int main(void)
{
BiTree T;
BiTree *p = (BiTree*)malloc(sizeof(BiTree));
int deepth,num=0 ;
Create_BiTree(&T);
printf("先序遍历二叉树:\n");
TraverseBiTree(T);
printf("\n");
printf("中序遍历二叉树:\n");