收藏 分享(赏)

实验报告(二叉树的构建、基本操作和遍历).doc

上传人:HR专家 文档编号:5168227 上传时间:2019-02-11 格式:DOC 页数:12 大小:75KB
下载 相关 举报
实验报告(二叉树的构建、基本操作和遍历).doc_第1页
第1页 / 共12页
实验报告(二叉树的构建、基本操作和遍历).doc_第2页
第2页 / 共12页
实验报告(二叉树的构建、基本操作和遍历).doc_第3页
第3页 / 共12页
实验报告(二叉树的构建、基本操作和遍历).doc_第4页
第4页 / 共12页
实验报告(二叉树的构建、基本操作和遍历).doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、附录 A9实 验 报 告课 程 : 数 据 结 构 ( c 语 言 ) 实 验 名 称 : 二 叉 树 的 构 建 、基 本 操 作 和 遍 历系 别 : 数 字 媒 体 技 术 实 验 日 期 : 专 业 班 级 : 媒 体 161 组 别 : 无 姓 名 : 学 号 :实 验 报 告 内 容验证性实验一、预习准备:实验目的:1、熟练掌握二叉树的结构特性,熟悉二叉树的各种存储结构的特点及适用范围;2、熟练掌握二叉树的遍历方法及遍历算法;3、掌握建立哈夫曼树和哈夫曼编码的方法及带权路径长度的计算。实验环境:Widows 操作系统、VC6.0实验原理:1. 定义:树:树(tree)是 n(n0)

2、个结点的有限集 T,其中,有且仅有一个特定的结点,称为树的根(root)。当 n1 时,其余结点可分为 m(m0)个互不相交的有限集 T1,T2,Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)二叉树:二叉树是 n(n=0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。哈夫曼树: 最优二叉树赫夫曼树设有 n 个权值w1,w2,wn,构造一棵有 n 个叶子结点的二叉树,每个叶子的权值为 wi,则 wpl 最小的二叉树叫 Huffman 树。2. 特点:树:树中至少有一个结点根树中各子树是互不相交的集合二叉树:每个结点至多

3、有二棵子树(即不存在度大于 2 的结点)二叉树的子树有左、右之分,且其次序不能任意颠倒哈夫曼树:一棵有 n 个叶子结点的 Huffman 树有 2n-1 个结点采用顺序存储结构动态分配数组存储3. 表示:遍历二叉树:先序遍历:先访问根结点,然后分别先序遍历左子树、右子树中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树后序遍历:先后序遍历左、右子树,然后访问根结点按层次遍历:从上到下、从左到右访问各结点构造 Huffman 树的方法Huffman 算法(1) 根据给定的 n 个权值w1,w2,wn,构造 n 棵只有根 结点的二叉树,令起权值为 wj;(2) 在森林中选取两棵根结点权

4、值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和;(3) 在森林中删除这两棵树,同时将新得到的二叉树加入森林中重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。4. 实验内容和要求:( 1) 二 叉 树建 立 如 下 图 所 示 的 二 叉 树 :要 求 : 1、 建 立 带 头 结 点 的 二 叉 树 , 将 二 叉 树 初 始 化 为 空 ;2、 依 次 将 二 叉 树 的 所 有 结 点 插 入 , 建 立 上 图 所 示 的 二叉 树 ;3、 用 户 可 由 键 盘 输 入 数 据 实 现 对 二 叉 树 各 结 点 的 插 入 、删 除 等

5、操 作 ;4、 打 印 二 叉 树 ;5、 对 二 叉 树 实 现 前 序 、 中 序 、 后 序 遍 历 ;AB CD E FG算 法 思 想 :建 立 一 棵 只 有 头 结 点 的 二 叉 树 , 并 通 过 调 用 插 入 左 子 树 和 插 入右 子 树 操 作 , 依 次 将 上 图 中 的 结 点 插 入 二 叉 树 中 , 利 用 二 叉 树 的特 殊 中 序 遍 历 方 法 将 该 树 以 凹 入 表 示 法 打 印 显 示 。 最 后 , 调 用 二叉 树 的 前 序 、 中 序 、 后 序 遍 历 函 数 对 二 叉 树 进 行 遍 历 , 并 显 示 遍历 结 果 。(

6、2)、 哈 夫 曼 树设 有 字 符 集 A、 B、 C、 D, 各 字 符 在 电 文 中 出 现 的 次 数 集 为1, 3, 5, 7, 设 计 各 字 符 的 哈 夫 曼 编 码 。要 求 :1、 构 造 字 符 集 的 哈 夫 曼 树 , 其 结 点 数 据 结 构 如 下 :2、 由哈 夫 曼 树 构 造 哈 夫 曼 编 码 , 输 出 权 值 及 其 对 应 的 编 码 。算 法 思 想 :首 先 , 由 给 定 的 n 个 权 值 构 造 有 2n-1 个 结 点 的 哈 夫 曼 树 。 在哈 夫 曼 树 中 , 其 叶 结 点 的 权 值 为 相 应 的 给 定 权 值 ,

7、非 叶 结 点 的 权值 为 其 孩 子 结 点 的 权 值 之 和 。哈 夫 曼 树 构 造 过 程 如 下 :1. 根据给定的 n 个权值 w 1,w 2,w n,构成的 n 棵二叉树的森林 F = T 1,T 2,T n,其中每棵二叉树 Ti 中只有一个权值为 w i 的结点,其左、右子树均为空;2. 在 F 中选取根结点的权值最小和次小的两棵树作为左、右子树构造一棵新的二叉树,且置新二叉树的根结点的权值为其左、右子树上根结点的权值之和;3. 在 F 中删除这两棵二叉树,并将新二叉树加入到 F 中;4. 重复 2 和 3,直到 F 中只含一棵树为止。这棵树就是哈夫曼树。weightfla

8、g parentleftChildrightChild其次,对 n 个结点的哈夫曼树进行不等长编码。保证任何一个字符的哈夫曼编码不为另一字符的哈夫曼编码的前缀。二、实验过程: 实验中的关键语句:前序遍历中序遍历什么的都是一个道理,只是输出的时候的顺序不同,都是先访问左孩子或者右孩子后在访问另一边(1) 先序遍历二叉树 T 的递归算法Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) Status PrintElement( ElemType e ) printf( e ); return OK;PreOrderTraver

9、se(T, PrintElement);if (T) if (Visit(T-data)if (PreOrderTraverse(T-lchild, Visit)if (PreOrderTraverse(T-rchild, Visit) return OK;return ERROR; else return OK; / PreOrderTraverse(2) 中序遍历二叉树 T 的非递归算法Status InOrderTraverse(BiTree T, Status (*Visit)(ElemType) Stack S;BiTree p;InitStack(S); Push(S, T); w

10、hile (!StackEmpty(S) while (GetTop(S, p) Pop(S, p); if (!StackEmpty(S) Pop(S, p); if (!Visit(p-data) return ERROR;Push(S, p-rchild);return OK; / InOrderTraverse (3)void Huffman:CreateHTree(int a,int n) HTree=new HNode 2*n-1;for(int i=0;i=HTreex.weight) if(HTreejjj.weight=HTreey.weight ) if(HTreejj.w

11、eight=HTreex.weight) if(HTreejjj.weight_min) _min=HTreejjj.weight; y=jjj; bbk=y; k+; HTreex.parent=HTreey.parent=ii; HTreeii.weight=HTreex.weight+HTreey.weight; HTreeii.lchild=x; HTreeii.rchild=y; HTreeii.parent=-1; 编写及调试程序中遇到的问题及解决方法:(1)执行程序时程序停止运行。解决:看到程序停止运行,推测可能的原因:遇到死循环、参数设置不合理或者结构体没有造好。首先对结构体进

12、行了检查,各个成员声明正常无误,在对程序进行调试,程序正常跳出循环,因此最可能是自定义函数的参数设置的不合理,因此对调用的自定义函数进行相应的改动,将参数由具体类型改为指针类型后,程序正常运行。(2)程序不停的输出同一个结点的数据。解决:分析运行结果可知,第一不停的输出证明遇到了死循环,第二输出的是同一个结点的数据,表示指针没有按预期进行指向,首先对程序进行调试,发现程序没有添加循环结束条件,添加循环结束条件后,只能输出树的部分结点的数据,对标志位进行修改后,程序运行正常,也能正确输出遍历结果。实验总结: 1. 实验结果及分析:运行结果显示可以实现实验要求。2. 实验总结:遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。 递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。非递归如程序主要语言中所示。3. 思考题:已知一棵二叉树的层序序列是 ABCDEFGHIJ,中序序列是 DBGEHJACIF,试画出此二叉树。A/ B C/ D E F / /G H IJ

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报