当前位置:文档之家› 数据结构—最优二叉树及其应用

数据结构—最优二叉树及其应用

实验一最优二叉树及其应用1.程序设计简介本实验程序用于验证最优二叉树的算法。

树的存储采用带孩子的双亲顺序存储方法。

2.源程序//最优二叉树#include<iostream>#include<iomanip>using namespace std;//定义结点类型template <class T>struct hufnode{T wei;//权值int prt;//指向父结点的指针域(结点元素的下标)int lch;//左指针域(结点元素的下标)int rch;//右指针域(结点元素的下标)};//由于数组下标一般是非负数整数,因此可以用-1作为空指针值template <class T>class huffman_BT{int nn;//叶子结点的个数hufnode<T>*BT;//最优二叉树顺序存储空间的首地址public:huffman_BT(){BT=NULL;}//构造函数,对最优二叉树进行初始化void creat_hufm_BT(int n,T w[]);//生成最优二叉树void select(hufnode<T>*p,int k,int *i,int *j);void prt_hufm_BT();//输出最优二叉树存储空间状、};//生成最优二叉树template <class T>void huffman_BT<T>::creat_hufm_BT(int n,T w[]){//n是叶子结点的个数,w是叶子结点的权值数组hufnode<T> *p;int k,i,j,m;nn=n;m=n*2-1;BT=new hufnode<T>[m];//申请最优二叉树存储空间p=BT;for(k=0;k<m;k++){//设置初始状态,所有结点的指针为空(p+k)->prt=-1;(p+k)->lch=-1;(p+k)->rch=-1;}for(k=0;k<n;k++){//前n个结点的权值分别为个结点的权值(p+k)->wei=w[k];}for(k=n;k<m;k++){//构造最优二叉树select(p,k,&i,&j);//在前K-1个结点中选择权值最小的两个根结点i和j(p+i)->prt=k;(p+j)->prt=k;//合并构成新的二叉树(p+k)->lch=i;(p+k)->rch=j;(p+k)->wei=(p+i)->wei+(p+j)->wei;}}template <class T>void huffman_BT<T>::select(hufnode<T>*p,int k,int *i,int *j){//在前K-1个结点中选择权值最小的两个根结点i和jT w;int n=0;while(n<k&&(p+n)->prt!=-1) n++;//寻找指向父结点指针为空的起始结点w=(p+n)->wei;*i=n;while(n<k){if((((p+n)->wei)<w)&&((p+n)->prt==-1)){*i=n;w=(p+n)->wei;}n++;}n=0;while((n<k)&&((p+n)->prt!=-1)||(n==(*i))) n++;w=(p+n)->wei;*j=n;while(n<k){if(((p+n)->wei<w)&&(n!=(*i))&&((p+n)->prt==-1)){*j=n;w=(p+n)->wei;}n++;}if((*i)>(*j)){n=(*i);*i=*j;*j=n;}}template <class T>void huffman_BT<T>::prt_hufm_BT(){hufnode <T>*p;int k;p=BT;cout<<"k"<<setw(7)<<"WEI"<<setw(7)<<"PRT"<<setw(7)<<"LCH"<<setw(7)<<"RCH"<<endl;for(k=0;k<2*nn-1;k++){cout<<k<<setw(7)<<(p+k)->wei<<setw(7)<<(p+k)->prt<<setw(7)<<(p+k)->lch<<setw(7)<<(p+k)->rch<<endl;} }void main(){int *w;int op;int i;huffman_BT<int> b;do{cout<<"1-输入结点权值"<<endl;cout<<"2-生成最优二叉树"<<endl;cout<<"3-退出程序"<<endl;cout<<"请选择操作:[ ]";cout<<"\b\b";cin>>op;switch(op){case 1:cout<<"请输入结点的个数:";int sum;cin>>sum;w=new int[sum];cout<<"请依次输入权值:"<<endl;for(i=0;i<sum;i++){ cout<<"请输入第"<<i+1<<"个权值:";cin>>w[i];}break;case 2:b.creat_hufm_BT(sum,w);b.prt_hufm_BT();system("pause");break;case 3:cout<<"结束运行,Bye-Bye!"<<endl;break;}}while(op!=3);}3.运行结果实验二二叉树相似问题1.问题描述两棵二叉树相似,指要么它们都为空或都只有一个根结点,要么它们的左右子树均相似。

本问题是:设计一个算法,判断两棵二叉树是否相似。

2.基本要求(1)设计二叉树的存储结构和建立算法;(2)设计二叉树相似的判断算法;(3)输入:两棵二叉树;(4)输出:判定结果,相似或不相似。

3.源代码#include<iostream>using namespace std;static int count=1;struct node{char data;node *lchild;node *rchild;};class Bitree{public:node *root;Bitree(){root=NULL;}void CreatBitree();void PretraBitree();};static void Create(node*p,int k){ //创建二叉树node *q;char x;cin>>x;if(x!='#'){q=new node;q->data=x;if(k==1)p->lchild=q;if(k==2)p->rchild=q;Create(q,1);Create(q,2);}else{ q=new node;q->data=x;q->lchild=NULL;q->rchild=NULL;if(k==1)p->lchild=q;if(k==2)p->rchild=q;}}void Bitree::CreatBitree(){node *p;char x;cin>>x;if(x=='#'){p=new node;p->data=x;p->lchild=NULL;p->rchild=NULL;}else{p=new node;p->data=x;root=p;Create(p,1);Create(p,2);}}static void pretraverse(node *p) { //遍历二叉树if(p!=NULL){pretraverse(p->lchild);pretraverse(p->rchild);}}void Bitree::PretraBitree(){node *p;p=root;pretraverse(p);cout<<endl;}static void like(node *a,node *b){if(a!=NULL&&b!=NULL){if((a->data=='#'&&b->data!='#')||(a->data!='#'&&b->data=='#'))count=0;like(a->lchild,b->lchild);like(a->rchild,b->rchild);}}void work(){Bitree a;Bitree b;cout<<"输入二叉树A:"<<endl;a.CreatBitree(); //创建二叉树Aa.PretraBitree();// 先序遍历二叉树Acout<<"输入二叉树B:"<<endl;b.CreatBitree(); //创建二叉树Bb.PretraBitree();// 先序遍历二叉树Blike(a.root,b.root); //判断AB是否相似cout<<"判断结果:";if(count==1) cout<<"A与B相似"<<endl;else cout<<"A与B不相似"<<endl;}int main(){work();return 0;}4.运行结果:心得与体会:这次的实验使我了解到,平时对知识的积累相当重要,同时也要注重课上老师的讲解,老师在课上的延伸是课本上所没有的,这些知识对于我们对程序的编写有很大的作用,同时,编程也要求我们有足够的耐心,细细推敲。

相关主题