树和二叉树的实验2

来源:互联网 发布:驱动精灵 for linux 编辑:程序博客网 时间:2024/06/05 07:20

一、实验目的

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


Creat函数

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


Inorder函数(中序遍历)

void Bitree::Inorder(Binode * bt){if(bt == NULL)return;else{Inorder(bt->lchild);cout<<bt->data<<setw(8);Inorder(bt->rchild);}}


Postorder函数(后序遍历)

void Bitree::Postorder(Binode * bt){if(bt == NULL)return;else{Postorder(bt->lchild);Postorder(bt->rchild);cout<<bt->data<<setw(8);}}


Leverorder函数(层序遍历)

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


Relese函数(释放链表)

void Bitree :: Relese(Binode * bt){if(bt != NULL){Relese(bt->lchild);Relese(bt->rchild);delete bt;}}


Preorder函数(前序遍历)

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

实验截图:
输入(略),输入的树为





      


原创粉丝点击