一、 实验内容
自己确定一个二叉树(树结点类型、数目和结构自定)利用顺序结构方法存储。实现树的构造,并完成:
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的树,采用顺序存储的方法,即将二叉树当成完全二叉树的规格存储数据,这种存储方法适用于完全二叉树和满二叉树,存储效率较高,而不适用与左斜树和右斜树,会导致大量存储空间浪费。