1、(3)理解哈夫曼树的构造算法,学习设计哈夫曼编码和译码系统。二、实验环境(实验设备) 硬件: 微型计算机 软件: Microsoft Visual C+6.0三、实验原理及内容 实验题一:在二叉链表上实现二叉树运算(1)设计递归算法,实现下列二叉树运算:删除一棵二叉树、求一棵二叉树的高度、求一棵二叉树中叶子结点数、复制一棵二叉树、交换一棵二叉树的左右子树。(2)设计算法,按自上到下,从左到右的顺序,按层次遍历一棵二叉树。(3)设计main函数,测试上述每个运算。内容:1、建立头文件BTree.H,在该文件中定义二叉树的链式存储结构,并编写二叉树的各种基本操作实现函数。同时建立一个验证操作实现的
2、主函数文件Test.cpp,编译并调试程序,直到正确运行。注意:需要用到队列的有关操作。说明:二叉树的基本操作可包括:(1)void Clear(BTreeNode *BT) 清除一棵二叉树,并释放结点空间(2)void MakeTree(BTreeNode *BT) 构造一棵二叉树BT(3)void BreakTree(BTreeNode *BT) 撤销一棵二叉树BT(4)void PreOrder (BTreeNode *BT) 先序遍历二叉树BT(5)void InOrder(BTreeNode *BT) 中序遍历二叉树BT(6)void PostOrder(BTreeNode *BT)
3、 后序遍历二叉树BT (7) void FloorOrder(BTreeNode *BT) 层次遍历二叉树BT (8)int Size(BTreeNode *BT) 求二叉树BT的结点数量(9)void Exchange(BTreeNode *BT) 把二叉树BT的左右子树进行交换(10)int GetHeight(BTreeNode *BT) 求二叉树BT的高度(一)概要设计1.流程图及设计思想2.本程序包含的模块(1)主程序模块 Void main() 初始化; 构造一棵二叉树; 各种遍历二叉树; 对二叉树进行各种常见运算; 删除二叉树; (2) 二叉树模块实现二叉树的抽象数据类型和基本操
4、作(3) 队列模块实现队列的抽象数据类(4)二叉树运算模块求二叉树的结点,叶子数目(二)详细设计 一先序遍历:A自然语言描述:1.判断根节点会否为空,如果为空,返回2.如果根节点不为空3.先输出根节点,再递归调用自身依次输出左孩子和右孩子B代码详细分析template void BinaryTree:PreOrder(void (*Visit)(T& x) PreOrder(Visit,root);template x),BTNodeelement); PreOrder(Visit,t-lChild); PreOrder(Visit,t-rChild);二中序遍历:1.判断根节点是否为空,如果
5、为空,返回3. 递归调用自身输出左孩子,再输出根结点,递归调用输出右孩子B代码详细分析:InOrder(void (*Visit)(T& InOrder(Visit,root); InOrder(Visit,t-lChild);三后序遍历:A自然语言描述:3. 递归调用自身输出左孩子和右孩子,再输出根结点PostOrder(void (*Visit)(T& PostOrder(Visit,root); PostOrder(Visit,t-Visit(t-四层次遍历二叉树:1定义头指针和尾指针和空指针p2.根节点是否为空,如果是,结束3.如果不是,根节点入队4. 取队首元素,输出队首元素5.将队
6、首的非空左右结点入队列,删除队首元素6.循环下去,直到队列为空FloorOrder(void (*Visit)(T &x) FloorOrder(Visit,root);FloorOrder(void(*Visit)(Visit*x),BTNode*t) SeqQueueBTNodese(100); se.EnQueue(t); BTNodelchild) se.EnQueue(temp-lchild);child)rchild);五求二叉树的结点数:A. 自然语言描述:1:判断根节点是否为空,如果为空,返回02:如果根节点不为空 3:递归调用求二叉树的结点数的函数,参数改为根节点的左孩子 4
7、:递归调用求二叉树的结点数的函数,参数改为根节点的右孩子5:返回根节点的左右字数的结点数之和B代码详细分析:int BinaryTreeSize() return Size(root);Size(BTNodelChild)+Size(t-rChild)+1;六二叉树的左右交换:2.如果不为空,再判断该节点左右孩子是否同时为空,3.如果是,返回4.如果不为空,交换左右孩子5.返回循环,遍历左右子树Exchange() Exchange(root);Exchange(BTNodelChild; t-lChild=t-rChild;rChild=temp; Exchange(t-七求二叉树的深度:判
8、断根节点是否为空,如果根节点为空,返回0 如果根节点不为空但是根节点的左右孩子同时为空,返回1 如果以上两个条件都不成立递归调用求二叉树的深度,函数的参数改为根节点的左孩子,并且深度初始化为1递归调用求二叉树的深度,函数的参数改为跟结点的右孩子,并且深度初始化为0 6:返回4与5步中得出深度较大的那个数作为二叉树的深度数B 代码详细分析:GetHeight(BTNode tempr=GetHeight(t- if(templ+tempr+) return templ; return tempr;测试结果二叉树基本运算源代码:BTree.using namespace std;struct BT
9、Node T element; *lChild,*rChild; BTNode() lChild=rChild=NULL;BTNode(const T& x) element=x; BTNode(const T& x,BTNode *l,BTNode *r) lChild=l; rChild=r;class BinaryTreepublic: BinaryTree()root=NULL; BinaryTree()Clear(root); bool IsEmpty()const; void Clear(); bool Root(T &x)const; int Size(); void MakeT
10、ree(const T &e,BinaryTree& left,BinaryTree right); void BreakTree(T & void LevelOrder(void (*Visit(T& x); void PreOrder(void (*Visit)(T& x); void InOrder(void (*Visit)(T& void PostOrder(void (*Visit)(T&void Exchange(); int GetHeight();protected:* root;private: void Clear(BTNode* t); int Size(BTNode
11、void LevelOrder(void (*Visit)(T& void Exchange(BTNode int GetHeight(BTNodeClear(BTNode delete t;bool BinaryTreeelement; return true; return false;MakeTree(const T & right) if(root|&left=&right) root=new BTNode(e,left.root,right.root);left.root=right.root=NULL;BreakTree(T &x,BinaryTree left.root=root
12、- right.root=root- delete root; root=NULL;void Visit(T& coutx emplateFloorOrder(void(*Visit)(T& SeqQueuelChild) se.EnQueue(tmp-GetHeight() return GetHeight(root);emplate Test.Cpp:#include BTree.() BinaryTree a,b,x,y,z; y.MakeTree(E,a,b); z.MakeTree(F x.MakeTree(C,y,z);DB,y,x);前序遍历endl; z.PreOrder(Vi
13、sit);中序遍历 z.InOrder(Visit);后序遍历z.PostOrder(Visit);层次遍历 z.LevelOrder(Visit);cout结点数量:z.Size() z.Exchange();左右交换后的前序遍历z.PreOrder(Visit);树的高度:z.GetHeight() return 0;实验题二:哈夫曼编码和译码系统(1)所设计的系统重复显示以下菜单项:B建树:读入字符集和各字符频度,建立哈夫曼树。T遍历:先序和中序遍历二叉树。E生成编码:根据已建成的哈夫曼树,产生各字符的哈夫曼编码。C编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码
14、,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和codefile.txt中。D译码:读入codefile.txt,利用已建成的哈夫曼树进行译码,并将译码结果存入磁盘文件result.txt中。P打印:屏幕显示文件textfile.txt、codefile.txt和result.txt。X退出。源代码#include cstdlibqueuestringint *weightArray;string s;string *codeArray;struct BTNode *lChild, *rChild; BTNode() lChild = rChild = NULL; x) element = x;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1