数据结构 二叉树.docx
- 文档编号:2013676
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:24
- 大小:138.39KB
数据结构 二叉树.docx
《数据结构 二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构 二叉树.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构二叉树
常熟理工学院
《数据结构与算法》实验指导与报告书
_2017-2018_____学年第__1__学期
专业:
物联网工程
实验名称:
二叉树
实验地点:
N6-210
*******
计算机科学与工程学院
2017
实验六二叉树
【实验目的】
1、掌握二叉树的基本存储表示。
2、掌握二叉树的遍历操作实现方法(递归和非递归方法)。
3、理解并实现二叉树的其他基本操作。
4、掌握二叉树的重要应用---哈夫曼编码的实现。
【实验学时】
4-6学时
【实验预习】
回答以下问题:
1、二叉树的二叉链表存储表示。
/*---二叉树的二叉链表存储表示---*/
typedefstructBTNode
{
chardata;/*结点数据*/
structBTNode*lchild;/*左孩子指针*/
structBTNode*rchild;/*右孩子指针*/
}*BiTree;
2、二叉树的三种基本遍历方式。
/*先序遍历二叉树,补充递归算法*/
voidPreOrder(BiTreep)
{
if(p!
=NULL);
{
printf("%c",p->data);//访问根节点
PreOrder(p->lchild);//先序遍历左子数
PreOrder(p->rchild);//先序遍历右子数
}
}/*PreOrder*/
/*中序遍历二叉树,补充递归算法*/
voidInOrder(BiTreep)
{
if(p!
=NULL);
{
InOrder(p->lchild);//中序遍历左子数
printf("%c",p->data);//访问根节点
InOrder(p->rchild);//中序遍历右子数
}
}/*InOrder*/
/*后序遍历二叉树,补充递归算法*/
voidPostOrder(BiTreep)
{
if(p!
=NULL);
{
PostOrder(p->lchild);//后序遍历左子数
PostOrder(p->rchild);//后序遍历右子数
printf("%c",p->data);//访问根节点
}
}/*PostOrder*/
3、解释哈夫曼树和带权路径长度WPL。
哈夫曼树,是指权值为W1、W2、….Wn的n个叶节点所构成的二叉树中带权路径长度最小的二叉树。
从树根结点到到该结点之间的路径长度与该结点上权的乘积称为结点的带权路径长度,通常记作:
WPL=Σ(n,i=1)WiLi
【实验内容和要求】
1、编写程序exp6_1.c,实现二叉树的链式存储及基本操作。
以下图所示的二叉树实现二叉树的二叉链表存储及基本操作,回答下列问题,补充完整程序,并调试运行验证结果。
(1)按照先序序列建立该二叉树。
读入的字符序列应为:
A,B,C,*,*,D,E,*,G,*,*,F,*,*,*(*表示空指针)。
(2)该二叉树的三种遍历序列:
先序序列:
A,B,C,D,E,G,F;
中序序列:
C,B,E,G,D,F,A;
后序序列:
C,G,E,F,D,B,A;
(3)按层次遍历该二叉树,得到的序列为:
A,B,C,D,E,F,G
(4)该二叉树的深度为5。
(5)该二叉树的叶子结点数为:
______3_____。
(6)交换该二叉树所有结点的左右次序得到的新二叉树为:
(画出新二叉树的图)
(7)新二叉树的三种遍历序列分别为:
先序序列:
A,B,D,C,F,G,E;
中序序列:
D,B,F,G,C,E,A;
后序序列:
D,G,F,E,C,B,A;
exp6_1.c参考程序如下:
#include
#include
#defineMAX20
/*---二叉树的二叉链表存储表示---*/
typedefstructBTNode
{
chardata;/*结点数据*/
structBTNode*lchild;/*左孩子指针*/
structBTNode*rchild;/*右孩子指针*/
}*BiTree;
/*---非递归遍历辅助队列---*/
typedefstructSqQueue
{
BiTreedata[MAX];
intfront,rear;
}SqQueue;
voidcreateBiTree(BiTree*t);/*先序遍历创建二叉树*/
voidPreOrder(BiTreep);/*先序遍历二叉树*/
voidInOrder(BiTreep);/*中序遍历二叉树*/
voidPostOrder(BiTreep);/*后序遍历二叉树*/
voidRPreorder(BiTreep);/*先序遍历的非递归算法*/
voidRInorder(BiTreep);/*中序遍历的非递归算法*/
voidRPostorder(BiTreep);/*后序遍历的非递归算法*/
intdepth(BiTreet);/*求二叉树的深度算法*/
BiTreegettreenode(charx,BiTreelptr,BiTreerptr);/*后序复制二叉树-建立结点*/
BiTreecopytree(BiTreet);/*以后序遍历的方式复制二叉树*/
BiTreeswap(BiTreeb);/*交换二叉树的结点的左右孩子*/
voidccOrder(BiTreet);/*利用循环队列实现层次遍历*/
intLeaves(BiTreet);/*统计二叉树叶子结点(递归)*/
voidrelease(BiTreet);/*释放二叉树*/
/*先序遍历创建二叉树*/
voidcreateBiTree(BiTree*t)
{
chars;
BiTreeq;
printf("\npleaseinputdata:
");
s=getchar();
getchar();/*扔掉存在键盘缓冲区的输入结束回车符*/
if(s=='#')/*子树为空则返回*/
{
*t=NULL;
return;
}
else
{
q=(BiTree)malloc(sizeof(structBTNode));
if(q==NULL)
{
printf("Memoryallocfailure!
");
exit(0);
}
q->data=s;
*t=q;
createBiTree(&q->lchild);/*递归建立左子树*/
createBiTree(&q->rchild);/*递归建立右子树*/
}
}/*createBiTree*/
/*先序遍历二叉树,补充递归算法*/
voidPreOrder(BiTreep)
{
if(p!
=NULL)
{
printf("%c",p->data);//访问根节点
PreOrder(p->lchild);//先序遍历左子数
PreOrder(p->rchild);//先序遍历右子数
}
}/*PreOrder*/
/*中序遍历二叉树,补充递归算法*/
voidInOrder(BiTreep)
{
if(p!
=NULL)
{
InOrder(p->lchild);//中序遍历左子数
printf("%c",p->data);//访问根节点
InOrder(p->rchild);//中序遍历右子数
}
}/*InOrder*/
/*后序遍历二叉树,补充递归算法*/
voidPostOrder(BiTreep)
{
if(p!
=NULL)
{
PostOrder(p->lchild);//后序遍历左子数
PostOrder(p->rchild);//后序遍历右子数
printf("%c",p->data);//访问根节点
}
}/*PostOrder*/
/*先序遍历的非递归算法*/
voidRPreorder(BiTreep)
{
BiTreestack[MAX],q;
inttop=0,i;
for(i=0;i stack[i]=NULL;/*初始化栈*/ q=p; while(q! =NULL) { 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*/ /*中序遍历的非递归算法*/ voidRInorder(BiTreep) { BiTreestack[MAX],q;//定义节点栈和搜索指针 inttop=0; q=p; do { while(q)//左链所有节点入栈 { stack[top++]=q; q=q->lchild; } if(top>0) { q=stack[--top]; printf("%c",q->data);//访问根 q=q->rchild; } }while(q||top! =0); }/*RInorder*/ /*后序遍历的非递归算法*/ voidRPostorder(BiTreep) { BiTreestack[MAX],q; inti,top=0,flag[MAX]; for(i=0;i { 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) { 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*/ /*求二叉树的深度算法,补充递归算法*/ intdepth(BiTreet) {intlc,rc; if(t==NULL) return0;//若为空树,则返回零 else { lc=depth(t->lchild);//递归求t的左子树深度 rc=depth(t->rchild);//递归求t的右子树深度 if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉树 二叉