一、实验目的
熟练掌握二叉树的结构特点,掌握二叉树的顺序存储和实现。
二、实验内容
1.用C++的模板来实现顺序队列,下面是代码:
main.cpp
#include<iostream>
using namespace std;
const int MaxSize=100;
class Binarytree {
private:
void printR(int x, int y);
char data[MaxSize];
int length;
public:
Binarytree(char a[], int n);
~Binarytree(){}
void Leveroder(); // 层序输出
void search(int i); // 查询结点i的双亲、孩子
void Parch(); // 输出双亲、孩子信息
void Leaf(); // 输出叶子信息
};
Binarytree::Binarytree(char a[],int n) {
if(n > MaxSize || n < 1) throw "参数非法";
for(int i = 0;i < n; i++)
data[i] = a[i];
length = n;
}
void Binarytree::search(int x) {
int count = 1;
for (int i = 1; i <= length; i++) {
if (data[i-1] != '\0') {
if (count == x) {
printR(i, x);
return;
} else {
count++;
}
}
}
}
void Binarytree::printR(int x, int y) {
int left = 2 * x;
int right = 2 * x + 1;
int p = x / 2;
if (data[x-1] != '\0') {
if(p >= 1)
cout << "结点" << y << ":" << data[x-1] << "\t双亲" << data[p-1] <<" ";
else
cout << "结点" << y << ":" << data[x-1] << "\t无双亲" <<" ";
if(data[left-1] != '\0' && left <= length)
cout << "\t左孩子" << data[left-1] << " ";
else
cout << "\t无左孩子" << " ";
if(data[right-1] != '\0' && right <= length)
cout<< "\t右孩子" << data[right-1];
else
cout<< "\t无右孩子";
cout << endl;
}
}
void Binarytree::Leveroder() {
for(int i = 0; i < length; i++) {
if(data[i] != '\0')
cout << data[i];
}
}
void Binarytree::Parch() {
for(int i = 1; i <= length; i++) {
search(i);
}
}
void Binarytree::Leaf() {
int a1,a2;
for(int i = 1; i <= length; i++)
{
a1 = 2 * i;
a2 = 2 * i + 1;
if(data[a1-1] == '\0' && data[a2-1] == '\0' && data[i-1] != '\0')
cout << data[i-1];
if(a1 > length && data[i-1] != '\0')
cout << data[i-1];
}
}
int main(int argc, const char * argv[]) {
char b[13] = {'A','B','C','D','\0','E','F','\0','G','\0','\0','\0','\0'};
Binarytree c(b,13);
cout << "该二叉树的层序输出为:";
c.Leveroder();
cout << endl;
cout << "输出所有关系:" << endl;
c.Parch();
cout << endl;
cout << "叶子结点为:";
c.Leaf();
cout << endl;
return 0;
}
控制台输出如下:
三、分析存储效率
这个demo的存储二叉树方法是是直接输入了一个层序遍历的数组,二叉树没有结点的地方使用’\0’来代替。程序中的二叉树类循环数组一次,依次按照相应位置保存字符,相当于保存了数组来构建二叉树。这种写法虽然在算法上没有什么难的,效率也挺高,但是对保存的数组要求高,必须按着格式书写。
四、 总结和心得
在程序实现中并没有什么新颖的地方,中规中矩的实现功能,重复实现输出关系函数,来输出所有关系。一开始学习二叉树那时,并不知道这种数据结构有什么用。在经过一段时间的学习和了解后,二叉树的用途十分多,而且在多门专业课中也有出现。