实验二 根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树教学提纲
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二根据二叉树的抽象数据类型的定义,使用二叉链表实现一
个二叉树
数据结构实验报告
实验名称:实验二——根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树
学生姓名:郭江枫
班级: 2017211125
班内序号: 10
学号: 2017210722
日期: 2018年5月24日
1.实验要求
根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树
基本要求:
根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。
二叉树的基本功能:
1、二叉树的建立
2、前序遍历二叉树
3、中序遍历二叉树
4、后序遍历二叉树
5、按层序遍历二叉树
6、求二叉树的深度
7、求指定结点到根的路径
8、二叉树的销毁
9、其他:自定义操作
编写测试main()函数测试线性表的正确性
2. 程序分析
2.1 存储结构
编码表存储结构:二叉树
二叉树结点结构:
template
struct node//定义结点
{
T data;//数据
node
node
};
2.2 关键算法分析
实现该项目需要有如下步骤:
步骤一:创建二叉树
步骤二:前序遍历
步骤三:中序遍历
步骤四:后序遍历
步骤五:层序遍历
步骤六:计算树的深度
步骤七:求指定结点到根的路径
步骤八:二叉树的销毁
步骤一:根据顺序存储结构和性质5,可知如果当前节点的位置为i,则
左孩子位置为2i,右孩子为2i+1.所以,创建二叉树以顺序存储结构为输入,采
用先建立根结点,再建立左右孩子的方法递归建立二叉链表的二叉树。
template
void creat(node
{
if (i <= n&&data[i - 1])//如果n个数据没有存储完并且数据不为空
{
R = new node
R->data = data[i - 1];//将第i个数据赋给R的data
creat(R->lch, data, 2 * i, n);//递归,建立左子树
creat(R->rch, data, 2 * i + 1, n);//递归,建立右子树
}
else R = NULL;//如果不满足,则为空
}
步骤二:由二叉树的前序遍历定义,结合递归,写出前序遍历的递归算
法。
template
void preorder(node
{
if (R != NULL)//如果R不为空,则执行以下操作
{
cout << R->data;//输出R的数据
preorder(R->lch);//遍历左子树
preorder(R->rch);//遍历右子树
}
} 步骤三:由二叉树的中序遍历定义,结合递归,写出中序遍历的递归算
法。
template
void inorder(node
{
if (R != NULL)//如果R不为空,则执行以下操作
{
inorder(R->lch);//遍历左子树
cout << R->data;//输出R的数据
inorder(R->rch);//遍历右子树
}
}
步骤四:由二叉树的后序遍历定义,结合递归,写出后序遍历的递归算法。
template
void postorder(node
{
if (R != NULL)//如果R不为空,则执行以下操作
{
postorder(R->lch);//遍历左子树
postorder(R->rch);//遍历右子树
cout << R->data;//输出R的数据
}
}
步骤五:在进行层序遍历时,对某一层的结点访问完毕后,在按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先访问的结点其左右孩子也要先访问,这与队列的特性比较吻合。因此,我们可以利用队列来实现二叉链表的层序遍历。
template
void levelorder(node
{
node
int f = 0, r = 0;//初始化空队列
if (R != NULL)
queue[++r] = R;//根结点入队
while (f != r)
{
node
cout << p->data;//输出队头元素
if (p->lch != NULL)
queue[++r] = p->lch;//如果左子树不为空,则将左子树元素入队
if (p->rch != NULL)
queue[++r] = p->rch;//如果右子树不为空,则将右子树元素入队
}
}