实验 6:树和二叉树的实验 2

这篇博客主要介绍了二叉树的概念及其在链式存储结构中的实现,包括前序、中序、后序遍历,以及输出结点的双亲、孩子信息和叶子结点信息。此外,还涉及了哈夫曼编码的转化和解码过程。
摘要由CSDN通过智能技术生成

一、实验目的 

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值