一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、 实验内容
1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:
1)用前序遍历、中序遍历、后序遍历输出结点数据;
2)以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码序列进行解码,也就是恢复原来的字符串序列。(*)
三、实验步骤
1、依据实验内容,先确定具体的二叉树,并说明结点的数据类型;
2、设计具体的算法;
3、写出完整程序;
4、总结、运行结果和分析算法效率。
5、总体收获和不足,疑问等。
四、实验要求
1、 按照数据结构实验任务书,提前做好实验预习与准备工作。
2、 在个人主页上发文章提交作业。
3、 实验课会抽查3-5人,希望你可以被查到!
实验代码:
头文件
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
const int num=30;
struct Binode{
string data;
Binode * lchild, * rchild;
};
class Bitree
{
private:
Binode * root;
Binode * S[num];
int top;
Binode * Creat(Binode * bt);
void Preorder(Binode * bt);
void Relese(Binode * bt);
void Inorder(Binode * bt);
void Postorder(Binode * bt);
void Parentchild(Binode * bt);
void Leaf(Binode * bt);
public:
Bitree(){root = Creat(root);}
~Bitree(){Relese(root);}
void Preorder(){Preorder(root);}
void Inorder(){Inorder(root);}
void Postorder(){Postorder(root);}
void Leverorder();
void Parentchild(){top = -1;Parentchild(root);}
void Leaf(){Leaf(root);}
};
Binode * Bitree::Creat(Binode * bt)
{
string ch;
cout<<"输入"<<endl;
cin>>ch;
if(ch == "#")
bt = NULL;
else{
bt = new Binode;
bt->data = ch;
bt->lchild = Creat(bt->lchild);
bt->rchild = Creat(bt->rchild);
}
return bt;
}
void Bitree::Inorder(Binode * bt)
{
if(bt == NULL)
return;
else{
Inorder(bt->lchild);
cout<<bt->data<<setw(8);
Inorder(bt->rchild);
}
}
void Bitree::Postorder(Binode * bt)
{
if(bt == NULL)
return;
else{
Postorder(bt->lchild);
Postorder(bt->rchild);
cout<<bt->data<<setw(8);
}
}
void Bitree::Leverorder()
{
int front,rear;
Binode * Q[30];
front = rear = -1;
if(root == NULL)
return;
Q[++rear] = root;
while(front != rear)
{
Binode * q = Q[++front];
cout<<q->data;
if(q->lchild != NULL)
Q[++rear] = q->lchild;
if(q->rchild != NULL)
Q[++rear] = q->rchild;
}
}
void Bitree :: Relese(Binode * bt)
{
if(bt != NULL){
Relese(bt->lchild);
Relese(bt->rchild);
delete bt;
}
}
void Bitree::Preorder(Binode * bt)
{
if(bt == NULL)
return;
else{
cout<<bt->data<<setw(8);
Preorder(bt->lchild);
Preorder(bt->rchild);
}
}
void Bitree::Parentchild(Binode * bt)
{
if(bt == NULL)
return;
else{
cout<<"结点为"<<bt->data<<endl;
S[++top] = bt;
if(top > 0)
{cout<<"双亲结点为"<<S[top-1]->data<<endl;}
if(bt->lchild != NULL)
{cout<<"左孩子为"<<(bt->lchild)->data<<endl;}
if(bt->rchild != NULL)
cout<<"右孩子为"<<(bt->rchild)->data<<endl;
cout<<endl;
Parentchild(bt->lchild);
Parentchild(bt->rchild);
--top;
}
}
void Bitree::Leaf(Binode * bt)
{
if(bt == NULL)
return;
else{
if(bt->lchild == NULL && bt->rchild == NULL)
cout<<bt->data<<endl;
Leaf(bt->lchild);
Leaf(bt->rchild);
}
}
void main()
{
Bitree tree;
cout<<"前序遍历"<<endl;
tree.Preorder();
cout<<endl;
cout<<"后序遍历"<<endl;
tree.Postorder();
cout<<endl;
cout<<"中序遍历"<<endl;
tree.Inorder();
cout<<endl;
cout<<"层序遍历"<<endl;
tree.Leverorder();
cout<<endl;
tree.Parentchild();
cout<<"叶子结点:"<<endl;
tree.Leaf();
}
实验截图:
输入(略),输入的树为