二叉树的顺序存储

本文探讨了如何使用顺序结构存储自定义的二叉树,包括构造树、层序输出节点数据、显示节点及其双亲和孩子信息、输出叶子节点,以及对存储效率的分析。顺序存储在完全二叉树和满二叉树中效率较高,但对左斜树和右斜树可能导致空间浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  实验内容

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

1)层序输出结点数据;

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

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

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


二、    源代码

#include<iostream>
#include<string>
const int MAXSIZE = 100;
using namespace std;
class  Tree {
private:
	int length;
	string data[MAXSIZE];
public:
	Tree() { length = 0; }
	~Tree() {}
	string Insert(string n, int i);//在第i个位置插入数据n
	int Delete(string x);
	void Printlist();
	void SearchP(int i);//查找父母结点
	void SearchL(int i);//查找左孩子结点
	void SearchR(int i);//查找右孩子结点

};

string Tree::Insert(string n, int i) {
	length++;
	return data[i] = n;

}
int Tree::Delete(string x) {
	for (int i = 0; i < length; i++) {
		if (x == data[i]) {
			data[i] = "NULL";
			return i + 1;
		}
	}
}

void Tree::Printlist() {
	for (int i = 0; i < length; i++) {
		cout << data[i] << ",";
	}
}

void Tree::SearchP(int i) {
	int p;
	if (i >1) {
		p = i / 2;
		cout << data[p - 1];
	}
}
void Tree::SearchL(int i) {
	int p = 0;
	if (2 * i <= length) {
		p = 2 * i;
		cout << data[2 * i - 1];
	}
}
void Tree::SearchR(int i) {
	int p = 0;
	if (2 * i + 1 <= length) {
		p = 2 * i + 1;
		cout << data[2 * i];
	}
}
int main() {
	string n;
	int k; int x;
	Tree K;
	cout << "可输入x个数值:";
	cin >> x;
	for (k = 0; k < x; k++) {
		cout << "插入数据:";
		cin >> n;
		K.Insert(n, k);
	}
	cout << "显示输入数据:";
	K.Printlist();
	cout << "\n";
	cout << "查找结点的父母结点:";
	cin >> k;
	K.SearchP(k);
	cout << "\n";
	cout << "查找结点的父母结点:";
	cin >> k;
	K.SearchP(k);
	cout << "\n";
	cout << "查找结点的左孩子:";
	cin >> k;
	K.SearchL(k);
	cout << "\n";
	cout << "查找结点的右孩子:";
	cin >> k;
	K.SearchR(k);
	cout << "\n";
	cout << "删除结点:";
	cin >> n;
	K.Delete(n);
	K.Printlist();


}

四、实验结果

五、总结与反思

二叉树是度不超过2的树,采用顺序存储的方法,即将二叉树当成完全二叉树的规格存储数据,这种存储方法适用于完全二叉树和满二叉树,存储效率较高,而不适用与左斜树和右斜树,会导致大量存储空间浪费。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值