【数据结构】第六章 树

二叉树

在这里插入图片描述

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值