实验3 二叉树的应用:从中序后序到层次输出

数据结构实验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.更加熟练地运用了二叉树的链表实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是蒸饺吖~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值