数据结构实验7
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七二叉树的建立与遍历
一、实验目的
1、了解二叉树的定义及基本运算。
2、掌握二叉树的描述方法、特点、性质及存储结构。
3、掌握二叉树的基本操作算法。
4、自主设计二叉树建立、遍历等操作的整个程序。
二、实验内容
根据建立任意给定的二叉树,并对此二叉树进行前序、中序、后序、层次四种遍历。
基本要求:
1)具有二叉树的创建功能;
2)可以进行二叉树的四种方式的遍历,遍历方式可由用户选择,遍历结果;
3)可统计二叉树中叶子结点、度位2的结点个数及总结点数;
4)可在二叉树中查找某一元素;
5)通过键盘可以建立任意给定的二叉树,并能完成以上操作控制。
5)自己编写、调试所有功能函数程序。
三、程序设计思路
用链式存储结构建立一个二叉树,将二叉树分为根结点、左子树和右子树三部分建立。
二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且只被访问一次。常用的二叉树遍历方法如下:
前序遍历:访问次序:根→左→右,
中序遍历:访问次序:左→根→右,
后序遍历:访问次序:左→右→根
层次遍历:访问次序:从上到下、从左到右一层一层进行
可按如下格式定义二叉树的链式存储结构:
typedef char datatype;
typedef struct BiTNode
{ datatype data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
模块划分:
1)void CreateBinTree(BiTree *T):以递归方式建立二叉树;
2)void PreOrder(BiTree bt)函数:前序遍历函数;
3)void InOrderOut(BiTree T)函数:中序遍历函数;
4)void PostOrder(BiTree bt)函数:后序遍历函数;
5)void LevelOrder(BiTree bt)函数:层次遍历函数;
6)int Allnode(BiTree root)函数:计算总结点个数函数;
7)BiTree Search(BiTree bt, datatype x)函数:查找函数;
8)int n2(BiTree bt)函数:计算度为2结点个数函数;
9)int CountLeaf(BiTree bt)函数:计算叶子结点个数函数。
四、部分参考源程序段
#include
#include
#define MAXNODE 10
typedef char datatype;
typedef struct BiTNode
{ datatype data;
struct BiTNode *lchild, *rchild;
} BiTNode,*BiTree;
void CreateBinTree(BiTree *T) // 以递归方式建立二叉树
{char ch;
scanf("\n%c",&ch);
if(ch=='0') *T=NULL; // 以0作为空结点的值以结束递归
else { *T=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->data=ch;
CreateBinTree(&(*T)->lchild); CreateBinTree(&(*T)->rchild); }
}
/*BiTree CreateBinTree(BiTree T) // 以递归方式建立二叉树
{char ch;
scanf("\n%c",&ch);
if(ch=='0') T=NULL; // 以0作为空结点的值以结束递归
else { T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=CreateBinTree(T->lchild); T->rchild=CreateBinTree(T->rchild); }
return(T);
}*/
void PreOrder(BiTree bt)
{ if(bt==NULL) return;
printf("%3c",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild); }
void InOrderOut(BiTree T)
{
}
void PostOrder(BiTree bt)
{
}
void LevelOrder(BiTree bt)
{ BiTree queue[MAXNODE];
int front,rear;
if(bt==NULL) return;
front=-1;
rear=0;
queue[rear]=bt;
while(front!=rear)
{front++;
printf("%3c",queue[front]->data);
//Visit(queue[front]->data);
if(queue[front]->lchild!=NULL)
{ rear++; queue[rear]=queue[front]->lchild; } if(queue[front]->rchild!=NULL)
{ rear++; queue[rear]=queue[front]->rchild; } }
}
int Allnode(BiTree root)
{ if(!root) return 0;