数据结构实验报告6-二叉树与哈夫曼树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*求二叉树的深度算法,补充递归算法*/ int depth(BiTree t) {
int rd,ld; if(!t) return 0; else { rd=depth(B->lchild);
ld=depth(B->rchild); if(rd>ld)
return ld+1;
else return rd+1; }
/*以后序遍历的方式递归复制二叉树*/ BiTree copytree(BiTree t) {
BiTree newlptr,newrptr,newnode; if(t==NULL)
return NULL; if(t->lchild!=NULL)
newlptr = copytree(t->lchild); else newlptr = NULL; if(t->rchild!=NULL)
/*中序遍历的非递归算法*/ void RInorder(BiTree p) {
BiTree stack[MAX],q; int top=0,i; for(i=0; i<MAX; i++) stack[i]=NULL; /*初始化树结点*/ q=p; while(q!=NULL) { if(q->rchild!=NULL) _____stack[top++]=q->rchild_____; /*
#include<stdio.h>
#include<malloc.h>
#define MAX 20
/*---二叉树的二叉链表存储表示---*/
typedef struct BTNode
{
char data ;
/*结点数据*/
struct BTNode *lchild; /*左孩子指针*/
struct BTNode *rchild ; /*右孩子指针*/
后遍历右子树。简记左-根-右。 (3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最
后访问根结点。简记左-右-根。
3、解释哈夫曼树和带权路径长度WPL。 哈夫曼树: 它是最优二叉树。 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带 权路径长度达到最小,则这棵树被称为哈夫曼树。
路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之 间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点 的层数为1,则从根结点到第L层结点的路径长度为L-1。 结点的权及带权路径长度 定义:若将树中结点赋给一个有着某种含义的数值,则这个数值称 为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径 长度与该结点的权的乘积。 树的带权路径长度 定义:树的带权路径长度规定为所有叶子结点的带权路径长度之 和,记为WPL。
A B C D
E F
G
(7)新二叉树的三种遍历序列分别为: 先序序列:____ABDFEGC______________________; 中序序列:____AFDGEBC______________________; 后序序列:____FGEDCBA______________________;
exp6_1.c参考程序如下:
/*先序遍历二叉树*/
void InOrder(BiTree p);
/*中序遍历二叉树*/
void PostOrder(BiTree p); /*后序遍历二叉树*/
void RPreorder(BiTree p);
/*先序遍历的非递归算法*/
void RInorder(BiTree p);
/*中序遍历的非递归算法*/
【实验内容和要求】
1、 编写程序exp6_1.c,实现二叉树的链式存储及基本操作。 以下图所示的二叉树实现二叉树的二叉链表存储及基本操作,回答 下列问题,补充完整程序,并调试运行验证结果。
(1)按照先序序列建立该二叉树。 读入的字符序列应为:________ABCDEFG_________________(*表 示空指针)。
//申请根结点 T->data =ch; // 给根结点数据域赋值 Create(T->Lchild);//建左子树 Create(T->Rchild);//建右子树 } } // Create
2、二叉树的三种基本遍历方式。 (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最
后遍历右子树。简记根-左-右。 (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最
newrptr = copytree(t->rchild); else newrptr = NULL; newnode = gettreenode(t->data, newlptr, newrptr); return(newnode); }/*copytree*/
(2)该二叉树的三种遍历序列: 先序序列:__ABCDEFG______________; 中序序列:__CBEGDFA______________;
后序序列:__CGEFDBA______________; (3)按层次遍历该二叉树,得到的序列为: _____ABCDEFG_______。 (4)该二叉树的深度为:__4______。 (5)该二叉树的叶子结点数为:____3_______。 (6)交换该二叉树所有结点的左右次序得到的新二叉树为:(画 出新二叉树的图)
/*释放二叉树*/
/*先序遍历创建二叉树*/
void createBiTree(BiTree *t)
{
char s;
BiTree q;
printf("\nplease input data:");
s=getchar();
getchar();
/*扔掉存在键盘缓冲区的输入结束回车符*/
if(s=='#')
PostOrder (p->rchild); printf("%c ",p->data); }
}/*PostOrder*/
/*先序遍历的非递归算法*/ void RPreorder(BiTree p) {
BiTree stack[MAX],q; int top=0,i; for(i=0; i<MAX; i++) stack[i]=NULL; /*初始化树结点*/ q=p; while(q!=NULL) {
/*先序遍历二叉树,补充递归算法*/ void PreOrder(BiTree p) {
if(p!=NULL) { printf("%c ",p->data);
PreOrder (p->lchild); PreOrder (p->rchild);
}
}/*PreOrder*/
/*中序遍历二叉树,补充递归算法*/ void InOrder(BiTree p) {
if(flag[top-1]==0) /*遍历结点的右子树*/ {
q=stack[top-1]; q=q->rchild; flag[top-1]=1; break; } else { q=stack[--top]; printf("%c",q->data); /*遍历结点*/ } } } if(top==0) break; } }/*RPostorder*/
/*以后序遍历的方式复制二叉树
*/
BiTree swap(BiTree b);
/*交换二叉树的结点的左右孩子*/
void ccOrder(BiTree t);
/*利用循环队列实现层次遍历*/
int Leaves(BiTree t);
/*统计二叉树叶子结点(递归)*/
void release(BiTree t);
}/*depth*/
/*建立结点*/ BiTree gettreenode(char x,BiTree lptr,BiTree rptr) {
BiTree t; t=(BiTree)malloc(sizeof(struct BTNode)); t-> data = x; t->lchild = lptr; t->rchild = rptr; return(t); }/*gettreenode*/
printf("%c",q->data); if(q->rchild!=NULL) _____stack[top++]=q->rchild_____; /*右指 针进栈*/ if(q->lchild!=NULL) q=q->lchild; /*顺着左指针继续向下*/ else if(top>0) q=stack[--top]; /*左子树访问完,出栈继续访问 右子树结点*/ else q=NULL; } }/*RPreorder*/
ElemType data ;//数据域 struct BiTNode *Lchild ;//左孩子指针 struct BiTNode *Rchild;//右孩子指针 } BiTNode ,*BiTree ; void Create(BiTree &T) {//输入扩展二叉树的先序序列,构建二叉链表 scanf(&ch); //输入一个元素 if (ch=='# ') T = NULL; else { T= (BiTree)malloc(sizeof(BiTNode));
右指针进栈*/ if(q->lchild==NULL) printf("%c",q->data); else stack[top++]=q->lchild; /*左指针进栈*/ q=q->lchild; /*顺着左指针继续向下*/ else if(top>0) q=stack[--top]; /*左子树访问完,出栈继续访问
if(p!=NULL) { InOrder (p->lchild);
printf("%c ",p->data); InOrder (p->rchild); }
}/*InOrder*/
/*后序遍历二叉树,补充递归算法*/ void PostOrder(BiTree p) {
if(p!=NULL) { PostOrder (p->lchild):
右子树结点*/ else q=NULL;
}
}/*RInorder*/
/*后序遍历的非递归算法*/ void RPostorder(BiTree p) {
BiTree stack[MAX],q; int i,top=0,flag[MAX]; for(i=0; i<MAX; i++) /*初始化栈*/ {
/*子树为空则返回*/
{
*t=NULL;
return;
} q=(BiTree)malloc(sizeof(struct BTNode)); if(q==NULL) {
printf("Memory alloc failure!"); exit(0); } q->data=s; *t=q; createBiTree(&q->lchild);/*递归建立左子树*/ createBiTree(&q->rchild);/*递归建立右子树*/ }/*createBiTree*/
stack[i]=NULL; flag[i]=0; } q=p; while(q!=NULL||top!=0) { if(q!=NULL) /*当前结点进栈,先遍历其左子树*/ {
stack[top]=q; flag[top]=0;
top++; q=q->lchild; } else { while(top) {
void RPostorder(BiTree p);
Biblioteka Baidu
/*后序遍历的非递归算法*/
int depth(BiTree t);
/*求二叉树的深度算法*/
BiTree gettreenode(char x,BiTree lptr,BiTree rptr);/*后序复制二叉树-
建立结点*/
BiTree copytree(BiTree t);
}*BiTree;
/*---非递归遍历辅助队列---*/ typedef struct {
BiTree data[MAX]; int front,rear; } queue;
void createBiTree(BiTree *t);
/*先序遍历创建二叉树*/
void PreOrder(BiTree p);
实验六 二叉树
【实验目的】
1、掌握二叉树的基本存储表示。 2、掌握二叉树的遍历操作实现方法(递归和非递归方法)。 3、理解并实现二叉树的其他基本操作。 4、掌握二叉树的重要应用---哈夫曼编码的实现。
【实验学时】
4-6学时
【实验预习】
回答以下问题: 1、二叉树的二叉链表存储表示。 typedef struct BiTNode{ // 结点结构
相关文档
最新文档