二叉树
3.实验报告
(1) 按先序次序输入二叉树中结点的值,建立一棵以二叉链表作存储结构的二叉树,然后按先序、中序、后序、层序遍历这棵二叉树,并完成二叉树的相应信息的统计(如各种结点数目、二叉树的深度等);
(2) 建立一棵二叉排序树,并对其遍历、结点统计、深度计算、数据查找等。(3) 设计一个完整的编码系统:针对一篇文档,统计各个字符的出现次数,并为其设计Huffman编码,然后进行译码。
#include <stdio.h>
#include <iostream>
#include <cstdlib>
using namespace std;
#include <iomanip>
#include <string.h>
#include <malloc.h>
#include <process.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef int Status;
BiTree_def.h
typedef int TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree_func.h
Status CreateTree(BiTree &T){
//按先序次序输入二叉树中结点的值(字符)
//构造二叉链表表示二叉树
char ch;
cin>>ch;
if(ch=='#'){
T=NULL;
}
else{
T=new BiTNode;
if(!T)
// if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;//生成根节点
CreateTree(T->lchild);//构造左子树
CreateTree(T->rchild);//构造右子树
}
return OK;
}
void PreOrderTraverse(BiTree T){
//先序遍历
if(T==NULL) return;
else{
cout<<T->data;//显示结点数据
cout<<",";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T){
//中序遍历
if(T==NULL) return;
else{
InOrderTraverse(T->lchild);
cout<<T->data;//显示结点数据
cout<<",";
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T){
//后序遍历
if(T==NULL) return;
else{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;//显示结点数据
cout<<",";
}
}
void LevelOrder(BiTree T){
LinkQueue Q;
BiTree b;
InitQueue(Q);
if(T){
EnQueue(Q,T);
while(!QueueEmpty(Q)){
DeQueue(Q,b);
cout<<b->data;
if(b->lchild) EnQueue(Q,b->lchild);
if(b->rchild) EnQueue(Q,b->rchild);
}
}
}
int TreeDepth(BiTree T){
//求树的深度
int h,lh,rh;
if(!T){
h=0;
}
else{
lh=TreeDepth(T->lchild);
rh=TreeDepth(T->rchild);
if(lh>=rh) h=lh+1;
else h=rh+1;
}
return h;
}
int CountNode(BiTree T){
//结点数
int num=0;
int lnum=0;
int rnum=0;
if(!T)
num=0;
else
{
lnum=CountNode(T->lchild);
rnum=CountNode(T->rchild);
num=lnum+rnum+1;
}
return num;
}
void insert(BiTree &T,TElemType x){
//插入二叉排序树
if(T==NULL){
T=(BiTree)malloc(sizeof(BiTree));
T->data=x;
T->lchild=NULL;
T->rchild=NULL;
}
else
{
if(x<=T->data) insert(T->lchild,x);
else insert(T->rchild,x);
}
}
void CreateBiTree(BiTree &root){
//创建二叉排序树
TElemType x;
root=NULL;
cin>>x;
while(x!=0){
insert(root,x);
cin>>x;
}
}
//Status Delete(BiTree &p){
// //从二叉排序树中删除结点p,并重接它的左或右子树
//}
LinkQueue_def.h
typedef BiTree ElemType;
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
LinkQueue_func.h
Status InitQueue(LinkQueue &Q){
//建立空队列
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW) ;//存储空间分配失败
Q.front->next = NULL;
return OK;
}
Status DestroyQueue(LinkQueue Q){
//销毁队列
while(Q.front){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
Status EnQueue(LinkQueue &Q,ElemType e){
//插入队尾元素
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status QueueEmpty(LinkQueue &Q){
//判断队列是否为空
if(Q.front==Q.rear){
return OK;
}else{
return FALSE;
}
}
Status DeQueue(LinkQueue &Q,ElemType &e){
//删除队头元素
QueuePtr p;
if(QueueEmpty(Q)) return ERROR;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
return OK;
}
main
#include "com_def.h"
#include "BiTree_def.h"
#include "LinkQueue_def.h"
#include "LinkQueue_func.h"
#include "BiTree_func.h"
//ABD###CE##F##
//1 9 8 5 6 7 4 3 2 0
//注意选1时将TElemType改成char
//注意选2时将TElemType改成int
int main() {
BiTree T;
int choice=0;
do{
cout<<"***********************************"<<endl;
cout<<"* 1.按先序次序创建二叉树 *\n";
cout<<"* 2.建立一颗二叉排序树 *\n";
cout<<"***********************************"<<endl;
cout<<"请输入你的选择:";
cin>>choice;
switch(choice){
case 1:
{
cout<<"------------------------------"<<endl;
cout<<"按先序次序输入二叉树中结点的值"<<endl;
CreateTree(T);
//1
cout<<endl;
cout<<"先序遍历"<<endl;
PreOrderTraverse(T);
cout<<endl;
//2
cout<<"中序遍历"<<endl;
InOrderTraverse(T);
cout<<endl;
//3
cout<<"后序遍历"<<endl;
PostOrderTraverse(T);
cout<<endl;
//4
cout<<"层序遍历"<<endl;
LevelOrder(T);
cout<<endl;
//5
cout<<"树的高度"<<endl;
cout<<TreeDepth(T)<<endl;
//6
cout<<"总结点数为"<<endl;
cout<<CountNode(T)<<endl;
cout<<endl;
break;
}
case 2:
{
cout<<"------------------------------"<<endl;
cout<<"创建排序二叉树"<<endl;
BiTree T1;
CreateBiTree(T1);
//1
cout<<endl;
cout<<"先序遍历"<<endl;
PreOrderTraverse(T1);
cout<<endl;
//2
cout<<"中序遍历"<<endl;
InOrderTraverse(T1);
cout<<endl;
//3
cout<<"后序遍历"<<endl;
PostOrderTraverse(T1);
cout<<endl;
//4
cout<<"层序遍历"<<endl;
LevelOrder(T1);
cout<<endl;
//5
cout<<"树的高度"<<endl;
cout<<TreeDepth(T1)<<endl;
//6
cout<<"总结点数为"<<endl;
cout<<CountNode(T1)<<endl;
cout<<endl;
break;
}
}
}while(choice!=0) ;
}