数据结构实验3 二叉树的应用:从中序后序到层次输出
问题分析
| 时间:2020.11.05| 实验完成度:30% |
[问题描述]
需要基于二叉链表来实现二叉树ADT
需要实现二叉树的各个基本操作
假设二叉树中每个结点的关键字为不相同的正整数。给定二叉树的后序和中序遍历序列,基于二叉树的基本操
作,实现二叉树的构建以及输出该二叉树的层次遍历序列。
[输入形式]
每个输入文件的第一行为一个正整数N(≤30),即二叉树中结点的总数。第二行给出了后续遍历序列,而第三
行给出中序遍历序列。
注意:每一行中的所有数字都用一个空格隔开。
[输出形式]
相应二叉树的层次遍历序列输出在一行中。一行中的所有数字必须由一个空格隔开,并且行首和行尾不得有多
余的空格。
【抽象数据类型设计】
数据对象: 两组整数
数据关系: 从键盘输入一个整数,代表接下来输入的整数组的最长个数,以换行符结束输入,再依次输入两组
整数组。
基本操作:
准备一个能够存储一个整数和两组整数的存储空间
创建一个存放二叉树的链表空间
通过后序和中序通过递归算法得到原来的二叉树
通过遍历按层次输出该二叉树
【线性表ADT的表示】
ADT IntegerSet{
数据对象: D = {ai | ai ∈ 整数 ,i = 1 ,2 , ···, n, n>=0}
数据关系: R = {<ai ,ai+1> | ai-1 ,ai ∈ D}
基本操作:
LNode()// 操作功能:构造函数
LNode(int tmp, LNode* l = NULL, LNode* r = NULL)// 操作功能:带参构造函数
void setElement(int e) // 操作功能:设置节点元素
LNode left() // 操作功能:返回左结点下标
void setLeft(LNode l) // 操作功能:设置左孩子
LNode *right() // 操作功能:返回右节点下标
void setRight(LNode *r)// 操作功能:设置右孩子
int getValue()// 操作功能:获得当前结点的值
}
基于链表的二叉树完成对线性表的基本操作
| 时间:2020.11.06 | 实验完成度:60% |
【实现层次遍历的函数】
//层次遍历
void LevelOrder(void(*visit)(LNode* node))
{
if (root == NULL)
return;
queue<LNode*>que;
que.push(root);
LNode* curr;
while (que.empty() != true){
curr = que.front();
if (curr->left() != NULL){
que.push(curr->left());
}
if (curr->right() != NULL){
que.push(curr->right());
}
que.pop();
visit(curr);
}
}
【实现遍历的函数】
LNode* creatTree(int pt[], int ptStart, int ptEnd, int in[], int inStart, int inEnd)
{
if (ptStart > ptEnd || inStart > inEnd)
{
return 0;
}
LNode* node = new LNode(pt[ptEnd]);
for (int i = inStart; i <= inEnd; i++)
{
if (in[i] == pt[ptEnd])
{
node->setLeft(creatTree(pt, ptStart, ptStart + i - inStart - 1, in, inStart, i - 1));
node->setRight(creatTree(pt, ptStart + i - inStart, ptEnd - 1, in, i + 1, inEnd));
break;
}
}
return node;
}
代码测试和总结
|时间:2020.11.07 | 实验完成度:100% |
【实验总结】
1.对二叉树的前序、中序、后序、遍历输出有了更好的了解。
2.更加熟练地运用了二叉树的链表实现。