一、实验目的
1、熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、实验内容
1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:
1) 用前序遍历、中序遍历、后序遍历输出结点数据;
2) 以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码序列进行解码,也就是恢复原来的字符串序列。(*)
三、实验步骤
1、依据实验内容,先确定具体的二叉树,并说明结点的数据类型;
2、设计具体的算法;
3、写出完整程序;
4、总结、运行结果和分析算法效率。
5、总体收获和不足,疑问等。
四、实验要求
1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、在个人主页上发文章提交作业。
3、 实验课会抽查3-5人,希望你可以被查到!
#ifndef bitree_H
#define bitree_H
const int MaxSize=10;
struct binode
{
char data;
binode *l,*r;
};
class Bitree
{
public:
Bitree(){root=creat(root);}
~Bitree(){release(root);}
void preorder(){preorder(root);}
void inorder(){inorder(root);}
void postorder(){postorder(root);}
void print(){print(root,NULL);} //输出 双亲、孩子信息
void printleaf(){printleaf(root);} //输出叶子信息
void count(){count(root);} //统计结点数
private:
char data[MaxSize];
int length;
binode *root;
binode *creat(binode *bt);
void release(binode *bt);
void preorder(binode *bt);
void inorder(binode *bt);
void count(binode *bt);
void postorder(binode *bt);
void print(binode *bt,binode *pr); //输出 双亲、孩子信息
void printleaf(binode *bt); //输出叶子信息
};
#endif
#include<iostream>
using namespace std;
#include"bitree.h"
int count=0;
binode *Bitree::creat(binode *bt)
{
char ch;
cout<<"请输入创建一棵二叉树的结点数据"<<endl;
cin>>ch;
if(ch=='#')return NULL;
else{
bt=new binode;
bt->data=ch;
bt->l=creat(bt->l);
bt->r=creat(bt->r);
}
return bt;
}
void Bitree::release(binode *bt)
{
if(bt!=NULL)
{
release(bt->l);
release(bt->r);
delete bt;
}
}
void Bitree::preorder(binode *bt)
{
if(bt==NULL)return;
else{
cout<<bt->data<<" ";
preorder(bt->l);
preorder(bt->r);
}
}
void Bitree::inorder(binode *bt)
{
if(bt==NULL)return;
else{
inorder(bt->l);
cout<<bt->data<<" ";
inorder(bt->r);
}
}
void Bitree::postorder(binode *bt)
{
if(bt==NULL) return ;
else{
postorder(bt->l);
postorder(bt->r);
cout<<bt->data<<" ";
}
}
void Bitree::count(binode *bt)
{
if(bt!=NULL)
{
count(bt->l);
count++;
count(bt->r);
cout<<count<<" ";
}
}
void Bitree::print(binode *bt,binode *pr)
{
if(bt!=NULL)
{
cout<<"结点为:"<<bt->data<<endl;
if(bt->l!=NULL)
cout<<"结点的左孩子为:"<<bt->l->data<<endl;
else
cout<<"该结点无左孩子."<<endl;
if(bt->r!=NULL)
cout<<"结点的右孩子为:"<<bt->r->data<<endl;
else
cout<<"该结点无右孩子."<<endl;
if(pr!=NULL)
cout<<"该结点的双亲为:"<<pr->data<<endl;
else
cout<<"该结点无双亲."<<endl;
print(bt->l,bt);
print(bt->r,bt);
}
}
}
void Bitree::printleaf(binode *bt)
{
if(bt!=NULL)
{
if(bt->l==NULL&&bt->r==NULL)
{
cout<<bt->data<<endl;
printleaf(bt->l);
printleaf(bt->r);
}
}
#include <iostream>
using namespace std;
#include "bitree.h"
int main()
{
Bitree T;
cout<<"------前序遍历------"<<endl;
T.preorder();
cout<<endl;
cout<<"------中序遍历------"<<endl;
T.inorder();
cout<<endl;
cout<<"------后序遍历------"<<endl;
T.postorder();
cout<<endl;
cout<<"------孩子双亲------"<<endl;
T.print();
cout<<endl;
cout<<"------叶子结点------"<<endl;
T.printleaf();
cout<<endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/810a74ed33ae90e90cd9e5e230e041de.png)