1.目的要求:
(1) 通过实验,掌握二叉树的两种基本的存储结构及二叉树的建立、遍历(先序、中序、后序、层次遍历),并加以应用(计算二叉树的高度、统计结点数目等)。
(2) Huffman编码和译码。
2.实验内容:
(1) 按先序次序输入二叉树中结点的值,建立一棵以二叉链表作存储结构的二叉树,然后按先序、中序、后序、层序遍历这棵二叉树,并完成二叉树的相应信息的统计(如各种结点数目、二叉树的深度等);
(2) 建立一棵二叉排序树,并对其遍历、结点统计、深度计算、数据查找等。
(3) 设计一个完整的编码系统:针对一篇文档,统计各个字符的出现次数,并为其设计Huffman编码,然后进行译码。
注:(1)~(2)为必做题,(3)为选做题。
3.主要仪器设备及软件
(1) PC机
(2) Dev C++ ,Visual C++, VS2010等
代码
1)
/*
方式:
扩充二叉树建立
样例:
先序建立:AB#D##C##
涉及:
二叉树的建立 先序 中序 后序
二叉树的遍历 先序 中序 后序 层序
二叉树的高度
*/
#include<cstdio>
#include<iostream>
#include<malloc.h>
#include<queue>
using namespace std;
typedef struct Node *T;
struct Node{
char data;
struct Node* Lchild;
struct Node* Rchild;
};
std::queue<T> q;
//先序建立
T preorder_create(T root)
{
char ch;
cin>>ch;
if(ch=='#') root=NULL;
else{
root=(T)malloc(sizeof(struct Node));
root->data=ch;
root->Lchild=preorder_create(root->Lchild);
root->Rchild=preorder_create(root->Rchild);
}
return root;
}
//中序建立
T inorder_create(T root)
{
char ch;
cin>>ch;
if(ch=='#') root=NULL;
else{
root=(T)malloc(sizeof(struct Node));
root->Lchild=preorder_create(root->Lchild);
root->data=ch;
root->Rchild=preorder_create(root->Rchild);
}
return root;
}
//后序建立
T postorder_create(T root)
{
char ch;
cin>>ch;
if(ch=='#') root=NULL;
else{
root=(T)malloc(sizeof(struct Node));
root->Lchild=preorder_create(root->Lchild);
root->Rchild=preorder_create(root->Rchild);
root->data=ch;
}
return root;
}
//先序遍历
void preorder_traversal(T root)
{
if(root){
cout<<root->data;
preorder_traversal(root->Lchild);
preorder_traversal(root->Rchild);
}
}
//中序遍历
void inorder_traversal(T root)
{
if(root){
preorder_traversal(root->Lchild);
cout<<root->data;
preorder_traversal(root->Rchild);
}
}
//后序遍历
void postorder_traversal(T root)
{
if(root){
preorder_traversal(root->Lchild);
preorder_traversal(root->Rchild);
cout<<root->data;
}
}
//层序遍历
void level_traversal