一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、 实验内容
1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实 现树的构造,并完成: 1) 用前序遍历、中序遍历、后序遍历输出结点数据;
2) 以合理的格式,输出各个结点和双亲、孩子结点信息;
3) 输出所有的叶子结点信息; 2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码 序列进行解码,也就是恢复原来的字符串序列。
(*) 三、实验步骤 1、依据实验内容,先确定具体的二叉树,并说明结点的数据类型; 2、设计具体的算法; 3、写出完整程序; 4、总结、运行结果和分析算法效率。
#include<iostream.h>
struct BiNode
{
char data;
BiNode *lchild,*rchild;
};
class BiTree
{
private:
BiNode *root; //指向根节点的头指针
BiNode *Creat(BiNode *bt);//构造函数调用
void Release(BiNode *bt);//析构函数
void PreOrder(BiNode *bt);//前序遍历
void InOrder(BiNode *bt);//中序遍历
void PostOrder(BiNode *bt);//后序遍历
void PrintPC(BiNode *bt,BiNode *pr); //打印结点的双亲和孩子的信息函数调用
void Printleaf(BiNode *bt); //打印叶子结点信息函数的调用
public:
BiTree()
{root=Creat(root);}
~BiTree()
{Release(root);}
void PreOrder()//前序遍历
{PreOrder(root);}
void InOrder()//中序遍历
{InOrder(root);}
void PostOrder()//后序遍历
{PostOrder(root);}
void PrintPC(){PrintPC(root,NULL);}//打印结点的双亲和孩子的信息
void Printleaf(){Printleaf(root);}//打印叶子结点的信息
};
BiNode *BiTree::Creat(BiNode *bt)//????????????????????????????????????????
{
char ch;
cout<<"请输入创建一颗二叉树的结点数据"<<endl;
cin>>ch;
if(ch=='#')return NULL;
else
{
bt=new BiNode;//生成一个结点
bt->data=ch;
bt->lchild=Creat(bt->lchild);//递归建立左
bt->rchild=Creat(bt->rchild);//递归建立右
}
return bt;
}
void BiTree::Release(BiNode *bt)
{
if(bt!=NULL)
{Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
void BiTree::PreOrder(BiNode *bt)
{
if(bt==NULL)return;//递归调用结束条件
else
{
cout<<bt->data;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void BiTree::InOrder(BiNode *bt)
{
if(bt==NULL)return ;
else
{
InOrder(bt->lchild);
cout<<bt->data;
InOrder(bt->rchild);
}
}
void BiTree::PostOrder(BiNode *bt)
{
if(bt==NULL)return;
else
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<<bt->data;
}
}
void BiTree::PrintPC(BiNode *bt,BiNode *pr)
{
if(bt!=NULL)
{
cout<<"结点为:"<<bt->data<<endl;
if(bt->lchild!=NULL)
cout<<"结点的左孩子为:"<<bt->lchild->data<<endl;
else
cout<<"该结点无左孩子."<<endl;
if(bt->rchild!=NULL)
cout<<"结点的右孩子为:"<<bt->rchild->data<<endl;
else
cout<<"该结点无右孩子."<<endl;
if(pr!=NULL)
cout<<"该结点的双亲为:"<<pr->data<<endl;
else
cout<<"该结点无双亲."<<endl;
PrintPC(bt->lchild,bt);
PrintPC(bt->rchild,bt);
}
}
void BiTree::Printleaf(BiNode *bt)
{
if(bt!=NULL)
{
if(bt->lchild==NULL&&bt->rchild==NULL)//叶子结点满足的条件
cout<<bt->data<<endl;
Printleaf(bt->lchild);
Printleaf(bt->rchild);
}
}
int main()
{
BiTree t;
cout<<"————前序遍历————"<<endl;
t.PreOrder();
cout<<"————中序遍历————"<<endl;
t.InOrder();
cout<<"————后序遍历————"<<endl;
t.PostOrder();
cout<<"————孩子双亲————"<<endl;
t.PrintPC();
cout<<"————叶子节点————"<<endl;
t.Printleaf();
cout<<endl;
return 0;
}