实验五 树和二叉树的实验1

本文介绍了一个关于二叉树顺序存储结构的实验,通过定义tree类并使用字符数组存储结点信息,实现了层序输出结点、输出叶子结点及查询结点的双亲和孩子信息等功能。

一、实验目的 

1、   熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现; 

2、   掌握树的顺序结构的实现; 

3、   学会运用树的知识解决实际问题 

二、 实验内容 

自己确定一个二叉树(树结点类型、数目和结构自定)利用顺序结构方法存储。实现树的构造,并完成: 

1)层序输出结点数据; 

2)以合理的格式,输出各个结点和双亲、孩子结点信息; 

3)输出所有的叶子结点信息; 

4)分析你的算法对于给定的二叉树的存储效率。

三、算法分析

1、定义tree类,长度为100的字符型数组,利用数组存放二叉树的结点信息。

2、print()层序输出不为空的结点,leaf()输出所有叶子结点信息,cp()查询结点双亲和孩子信息。

四、代码

#include<iostream>
using namespace std;
const int MaxSize=100;
class tree
{
private:
	char data[MaxSize];
	int length;
public:
	~tree(){}
	tree(char a[],int n);
	void print();
	void leaf();
	void cp(int i);
};
tree::tree(char a[],int n)
{
	int last=0;
	if(n>=MaxSize) throw"full";
	for(int i=0;i<n;i++)
	{	data[i]=a[i];
		length=n;
	}
}
void tree::print()
{
	for(int i=0;i<length;i++)
	{if(data[i]!='1')
	cout<<data[i]<<" ";}
	cout<<endl;
}
void tree::cp(int i)	
{
	if(data[2*i-1]!='1'&&2*i-1<length&&data[i-1]!='1') cout<<"左孩子:"<<data[2*i-1]<<endl;
	else cout<<"没有左孩子!"<<endl;
	if(data[2*i]!='1'&&2*i<length&&data[i-1]!='1') cout<<"右孩子:"<<data[2*i]<<endl;
	else cout<<"没有右孩子!"<<endl;
	cout<<"双亲为:"<<data[i/2-1]<<endl;
}
void tree::leaf()
{
	for(int i=1;i<=length;i++)
		if(data[i-1]!='1'&&data[2*i-1]=='1'&&data[2*i]=='1') cout<<data[i-1]<<" ";

}
void main()
{
	char t[13]={'A','B','C','1','D','E','1','1','1','F','1','1','G'};
	tree T(t,13);
	T.print();
	T.leaf();
	cout<<"查询第3个"<<endl;
	T.cp(3);
}
五、运行结果


六、总结

    用顺序存储结构方法存储二叉树和顺序表差不多。

    当二叉树为完全二叉树或满二叉树时,存储效率较高;当其为右斜树时,存储效率最低。


参考提供的引用,可获取部分关于树和二叉树的代码示例及相关信息。 ### 代码示例 引用[1]给出了个关于树的层序遍历的代码示例。该代码使用数组模拟二叉树,通过后序遍历的方式创建二叉树,并最终输出该树的层序遍历序列。 ```cpp #include<bits/stdc++.h> using namespace std; const int N = 35; // 用数组模拟二叉树 void creat(int i); int tree[35]; int n; int main() { cin >> n; creat(1); for(int i = 1; i <= n; i++){ if(i == 1) cout << tree[i]; else cout << " " << tree[i]; } return 0; } // 先序--中左右 中序--左中右 后序--左右中 // 知道节点个数的情况下 void creat(int i) // 像是dfs { if(i > n) return ; //cin >> tree[i];// 前序遍历创建二叉树 creat(i * 2); //cin >> tree[i];// 中序遍历创建二叉树 creat(2 * i + 1); cin >> tree[i];// 后序遍历创建二叉树 } ``` ### 解题思路 在引用[1]的代码中,解题思路如下: - 首先,定义个数组`tree`来模拟二叉树,数组的索引表示节点的编号。 - `creat`函数采用深度优先搜索(DFS)的思想,根据后序遍历的顺序创建二叉树。后序遍历的顺序是左右中,即先递归创建左子树,再递归创建右子树,最后读取当前节点的值。 - 在`main`函数中,读取节点的数量`n`,调用`creat`函数创建二叉树,最后按顺序输出数组中的元素,即为树的层序遍历序列。 ### 实验指导 对于树和二叉树实验,通常需要掌握以下几个方面: - 树和二叉树的基本概念,如节点、边、根节点、叶子节点、子树等。 - 二叉树的遍历方式,包括前序遍历、中序遍历、后序遍历和层序遍历。 - 二叉树的存储方式,如数组模拟、链表表示等。 - 利用递归和迭代的方法实现二叉树的各种操作。 引用[2]涉及树的同构问题,这也是树和二叉树实验中可能会涉及的内容。在解决树的同构问题时,需要比较两棵树的结构是否相同,通常需要对树进行遍历和比较操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值