实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
实验题目:二叉树
实验目的:
1、熟悉二叉树的结点类型和二叉树的基本操作。
2、掌握二叉树的前序、中序和后序遍历的算法。
3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。
基本要求:
1.编写程序bitree.cpp实现ADTBiTree,要求使用二叉链表存储。实现基本操作:InitBiTree(&T);
DestroyBiTree(&T);
PreOrder(T,visit());
InOrder(T,visit());
PostOrder(T,visit());
2.编码实现以下算法:
1)创建二叉树。(以先序扩展序列给出)
2)输出先序、中序和后序序列。
3)计算二叉树结点数、叶子结点数、高度。
测试数据:先序扩展序列:ABDF##G##E#H##C##输出:先序ABDFGEHC中序FDGBEHAC后序FGDHEBCA结点数:8叶子结点数:4高度:4。
实验拓展
1)实现层次遍历。
2)查找:查值为X的结点、双亲结点、孩子结点、兄弟结点
3)判断:判断一个二叉树是否为二叉排序树、完全二叉树、平衡和二叉树
4)处理:左右子树互换、复制、删除子树、插入子树
设计思路:
1.在二叉树的存储结构为链式存储结构。
2.在具体实现的时候建立不同函数,在主程序中用循环菜单的形式调用函数提高了效率。
概要分析:
二叉链表结构定义:
typedef struct BiNode{
ElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
CreatBiTree(BiTree &T);先序建立二叉树。
DestroyBiTree(BiTree &T);销毁二叉树;
PreOrder(BiTree &T);先序遍历二叉树
InOrder(BiTree &T);中序遍历二叉树
PostOrder (BiTree &T);后序遍历二叉树
PrintbyLev(BiTree &T);按层次遍历二叉树,利用队列的思想,从根结点开始将其放入一
个数组中,用i记录子节点尚未放入数组的位置,再将i所指向节点的左右节点放入队列中,然后i+1,对下一个节点这样操作,直至最后一个节点是叶子节点。
IsLeaf(BiTree &T);判断是否为叶子节点(是否有左右子树)。
FullBiTree(BiTree &T);判断是否为完全二叉树,采用广度优先遍历,从根节点开始,入队列,如果队列不为空,循环。遇到第一个没有左儿子或者右儿子的节点,设置标志位,如果之后再遇到有左/右儿子的节点,那么这不是一颗完全二叉树。
CountBiTree(BiTree &T);节点计数,用递归思想,对左右子树计数,再加起来。LevelNum(BiTree& T,int t,int d);计算层数,利用递归思想,对左右子树计算层数并取较大值。
LeafNum(BiTree& T,int t,int d,int ln);叶子节点计数,利用递归思想,计算左右子树叶子再计算和。
Balance(BiTree &T,int i);判断是否为平衡二叉树,递归判断左右是否为平衡二叉树(有层数记录)。
Sort(BiTree &T,int i);判断是否为二叉排序树,判断此节点是否满足排序树定义,在判断其左右子树是否满足。
PrintChild(BiTree &T);打印左右子树。
FindNode(ElemType x,BiTree &T);查找算法,如果是根节点提示是根节点并返回指向根节点的指针,若果不是则调用Findx函数。
FindX(ElemType x,BiTree &temp,BiTree &T);查找算法,返回指向对应子树的根节点的指针。
CopyBiT(BiTree &T,BiTree &C);复制子树。
运行截图:
主界面
建立二叉树
输出三序遍历及二叉树信息
按层输出
查找二叉树
分析二叉树
左右子树互换:对A 然后按层次输出
删除以B为根节点的子树:
(层次遍历)
复制节点C
增加节点B于A的左节点
(层次遍历)
结果与讨论:
程序完成情况较好,由于实验内容比较多,所以写了很多函数,但有些函数之间是有调用关系,减轻了工作量。同时利用循环菜单也让程序看起来更为简洁,调用子程序也更为方便。
程序代码:
#include
#include
#include
#include
using namespace std;
typedef int Status;
typedef char ElemType; typedef struct BiNode{
ElemType data;
struct BiNode *lchild,*rchild; }BiNode,*BiTree;
#define OK 1
#define ERROR 0
//先序遍历建立二叉树
Status CreatBiTree(BiTree &T){ ElemType c;
cin >> c;
if(c=='.'){
T=NULL;
}
else{