




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验五 二叉树一、 实验目的:1、掌握二叉树的创建算法、掌握二叉树的遍历算法2、掌握哈夫曼树的构造和应用,利用哈夫曼方法及其编/译码技术实现对传输信息编码/译码系统。二、 实验内容:1、 在一棵二叉链表表示的二叉树中,实现以下操作。1) 输出叶子结点。2) 求二叉树中叶子结点个数。3) 将每个结点的左子树与右子树交换。4) 已知先根和中根次序遍历序列构造二叉树。5) 判断两棵二叉树是否相等。6) 求结点所在的层次。7) 复制一棵二叉树。8) 判断一棵二叉树是否为完全二叉树。算法及测试结果粘贴如下:package Q1;public class BinaryNode<T> publi
2、c T data;public BinaryNode<T> left,right;public BinaryNode(T data,BinaryNode<T> left,BinaryNode<T> right)this.data=data;this.left=left;this.right=right;public BinaryNode(T data)this(data,null,null);public BinaryNode()this(null,null,null);package Q1;public class BinaryTree<T>p
3、ublic Node<String> head_pre;public Node<String> head_in;public BinaryNode<T> root;public BinaryTree()this.root=null;public boolean isEmpty()return this.root=null;private BinaryTree<String> init_make()BinaryTree<String> bitree=new BinaryTree<String>();BinaryNode<
4、;String> child_f,child_d,child_b,child_c;child_d=new BinaryNode<String>("D",null,new BinaryNode<String>("G");child_b=new BinaryNode<String>("B",child_d,null);child_f=new BinaryNode<String>("F",new BinaryNode<String>("H&quo
5、t;),null);child_c=new BinaryNode<String>("C",new BinaryNode<String>("E"),child_f);bitree.root=new BinaryNode<String>("A",child_b,child_c);return bitree;private void leaf(BinaryNode<String> p)if(p!=null)if(p.left=null && p.right=null)Syste
6、m.out.print(p.data+" ");leaf(p.left);leaf(p.right);private int leaf_count(BinaryNode<String> p)if(p=null)return 0;if(p.left=null && p.right=null)return 1;else return leaf_count(p.left)+leaf_count(p.right);private void exchange(BinaryNode<String> p)BinaryNode temp = new
7、BinaryNode();if(p!=null)temp=p.left;p.left=p.right;p.right=temp;exchange(p.left);exchange(p.right);public BinaryTree(T prelist,T inlist)this.root=preOrder_inOrder_make(prelist,inlist,0,0,prelist.length);private BinaryNode<T> preOrder_inOrder_make(T preList,T inList,int preStart,int inStart,int
8、 n)if(n<=0)return null;T elem=preListpreStart;BinaryNode<T> p=new BinaryNode<T>(elem);int i=0;while(i<n && !elem.equals(inListinStart+i)i+;p.left=preOrder_inOrder_make(preList,inList,preStart+1,inStart,i);p.right=preOrder_inOrder_make(preList,inList,preStart+i+1,inStart+i+1
9、,n-1-i);return p;private void preOrder(BinaryNode<String> p)if(p!=null)System.out.print(p.data+" ");preOrder(p.left);preOrder(p.right);private void inOrder(BinaryNode<String> p)if(p!=null)preOrder(p.left);System.out.print(p.data+" ");preOrder(p.right);private boolean
10、CompTree(BinaryNode<String> tree1,BinaryNode<String> tree2)if (tree1 = null && tree2 = null) return true; if (tree1 = null | tree2 = null) return false; if (tree1.data != tree2.data) return false; if (CompTree(tree1.left,tree2.left) && CompTree(tree1.right,tree2.right) |
11、CompTree(tree1.left,tree2.right) && CompTree(tree1.right,tree2.left) return true; return false; private int getLevel(T x) return getLevel(root, 1, x); private int getLevel(BinaryNode<T> p, int i, T x) if (p=null) return -1; if (p.data.equals(x) return i; int level = getLevel(p.left, i+
12、1, x); if (level=-1) level = getLevel(p.right, i+1, x); return level; private BinaryNode<T> copy(BinaryNode<T> p) if (p=null) return null; BinaryNode<T> q = new BinaryNode<T>(p.data); q.left = copy(p.left); q.right = copy(p.right); return q; private boolean isCompleteBinaryTr
13、ee() if (this.root=null) return true; LinkedQueue<BinaryNode<T>> que = new LinkedQueue<BinaryNode<T>>(); que.enqueue(root); BinaryNode<T> p=null; while (!que.isEmpty() p = que.dequeue(); if (p.left!=null ) que.enqueue(p.left); if (p.right!=null) que.enqueue(p.right); el
14、se break; else if (p.right!=null) return false; else break; while (!que.isEmpty() p = que.dequeue(); if (p.left!=null | p.right!=null) return false; return true; public static void main(String args)BinaryTree<String> tree1 =new BinaryTree<String>();tree1=tree1.init_make();System.out.prin
15、t("这棵树的叶子结点分别为: ");tree1.leaf(tree1.root);System.out.println();int num=tree1.leaf_count(tree1.root);System.out.println("这棵树的叶子结点个数为: "+num);System.out.print("这棵树的前序遍历为: ");tree1.preOrder(tree1.root);System.out.println();System.out.print("这棵树左右子树交换后的前序遍历为: ");t
16、ree1.exchange(tree1.root);tree1.preOrder(tree1.root);System.out.println();String preList ="A","B","D","G","C","E","F","H"String inList ="D","G","B","A","E","C",
17、"H","F"BinaryTree<String> tree_pre_in =new BinaryTree<String>(preList,inList);System.out.print("这棵树的前序遍历为: ");tree1.preOrder(tree_pre_in.root);System.out.println();BinaryTree<String> tree2 =new BinaryTree<String>();tree2=tree2.init_make();System.
18、out.println("判断这两棵二叉树时候相同:"+tree1.CompTree(tree1.root ,tree2.root);System.out.println("结点B所在的层数:"+tree1.getLevel("B");BinaryTree<String> tree3 =new BinaryTree<String>();tree3.copy(tree1.root);System.out.println("这课二叉树是否为完全二叉树:"+tree1.isCompleteBina
19、ryTree();package Q1;public class LinkedQueue<T> private Node<T> front,rear;public LinkedQueue()this.front=this.rear=null;public boolean isEmpty()return this.front=null&&this.rear=null;public void enqueue(T x)if(x=null)return;Node<T> q=new Node<T>(x,null);if(this.front
20、=null)this.front=q;elsethis.rear.next=q;this.rear=q;public T dequeue()if(isEmpty()return null;T temp=this.front.data;this.front=this.front.next;if(this.front=null)this.rear=null;return temp;package Q1;public class Node<T> public T data;public Node<T> next;public Node(T data,Node<T>
21、 next)this.data=data;this.next=next;public Node()this(null,null);2、 问题描述(设计性实验)哈夫曼树很易求出给定字符集及其概率(或频度)分布的最优前缀码。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。该技术一般可将数据文件压缩掉20至90,其压缩效率取决于被压缩文件的特征。利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时,降低传输成本。但是,这要求在发送端通过一个编码系统对待传送电文须预先编码,在接收须将传送来的数据进行译码。请自行设计实现一个具有初始化、编码、译码、输入/输出等功能的哈夫曼码的编码/译码系统。
22、并实现以下报文的编码和译码:“this program is my favorite”。测试数据某通信的电文字符集为26个英文字母及空格字符,其出现频度如下表所示:字符空格abcdefghi频度1866413223210321154757字符jklmnopqrs频度15322057631514851字符tuvwxyz频度80238181161实现提示如何创建哈夫曼树及如何求得各结点对应的哈夫曼编码算法1)设计思想描述(1) 问题分析。(2) 哈夫曼树中各结点的结构描述。(3) 哈夫曼树的存储结构描述(提示:分析采用顺序存储还是利用链式存储等)。2)主要算法设计与实现package Q2;pub
23、lic class TriElement int data,parent,left,right;public TriElement(int data,int parent,int left,int right)this.data=data;this.parent=parent;this.left=left;this.right=right;public TriElement(int data)this(data,-1,-1,-1);public TriElement()this(0);public String toString()return "("+this.data+
24、","+this.parent+","+this.left+","+this.right+")"package Q2;public class HuffmanTree private int leafNum;private TriElement hufftree;public HuffmanTree(int weight)int n=weight.length;this.leafNum=n;this.hufftree=new TriElement2*n-1;for(int i=0;i<n;i+)this.hu
25、fftreei=new TriElement(weighti);for(int i=0;i<n-1;i+)int min1=Integer.MAX_VALUE,min2=min1;int x1=-1,x2=-1;for(int j=0;j<n+i;j+)if(hufftreej.data<min1 && hufftreej.parent=-1)min2=min1;x2=x1;min1=hufftreej.data;x1=j;else if(hufftreej.data<min2 && hufftreej.parent=-1)min2=hu
26、fftreej.data;x2=j;hufftreex1.parent=n+i;hufftreex2.parent=n+i;this.hufftreen+i=new TriElement(hufftreex1.data+hufftreex2.data,-1,x1,x2); public String huffmanCodes()String hufcodes=new Stringthis.leafNum;for(int i=0;i<this.leafNum;i+)hufcodesi=""int child=i;int parent=hufftreechild.pare
27、nt;while(parent!=-1)if(hufftreeparent.left=child)hufcodesi="0"+hufcodesi;elsehufcodesi="1"+hufcodesi;child=parent;parent=hufftreechild.parent;return hufcodes;package Q2;public class Test public static void main(String args) String temp="this program is my favorite"int w
28、eight=186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1;HuffmanTree huf=new HuffmanTree(weight);String hufcodes=huf.huffmanCodes();System.out.println("huffman编码为:");System.out.print("空格:"+hufcodes0+" ");for(int i=1;i<weight.length/4;i+)Syst
29、em.out.print(char)(i+96)+":"+hufcodesi+" ");System.out.println();for(int i=weight.length/4;i<weight.length/2;i+)System.out.print(char)(i+96)+":"+hufcodesi+" ");System.out.println();for(int i=weight.length/2;i<weight.length/4*3+2;i+)System.out.print(char)(i+96)+":"+hufcodesi+"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肾动脉狭窄的临床护理
- 短视频直播带货专业化运营知识培训课件(30P)
- 生物的变异教学设计
- 护理团队建设报告
- 上斜肌腱鞘综合征的临床护理
- 江苏省连云港市灌南县2025年八年级数学第二学期期末达标检测模拟试题含解析
- 胆石症患者的护理
- 保健品会销实战策略
- 园林类国企面试题及答案
- 人教部编版五年级上册小学语文《将相和》教学设计
- 班组安全教育试题及答案
- 虎符铜砭刮痧课件
- 数字媒体对人际亲密关系的影响机制研究
- 税务审计理论试题及答案解析
- 智能海洋牧场装备行业跨境出海战略研究报告
- 麻醉镇静药与阿片类
- 中考化学第一轮复习 物质的性质与应用(常见的酸碱盐)测试题(解析版)
- 病理学课件-炎症的机制
- 2025年全国保密教育线上培训考试试题库含答案(新)附答案详解
- 2025世界高血压日控住血压稳住幸福高血压健康讲座
- 安徽卓越县中联盟2024-2025学年高三下学期5月份检测政治试卷+答案
评论
0/150
提交评论