武汉纺织大学数据结构实验报告2文档格式.docx
- 文档编号:18764109
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:18
- 大小:131.92KB
武汉纺织大学数据结构实验报告2文档格式.docx
《武汉纺织大学数据结构实验报告2文档格式.docx》由会员分享,可在线阅读,更多相关《武汉纺织大学数据结构实验报告2文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
②、运行程序,建立二叉树存储结构;
③、对二叉树进行中序线索化,建立中序线索二叉树;
④、输出中序遍历序列。
三、操作步骤:
1.二叉树
(1)接口类BinaryTTree.java
packagetree;
publicinterfaceBinaryTTree<
T>
{//二叉树接口,二叉树抽象数据类型
booleanisEmpty();
//判断二叉树是否为空
intcount();
//返回二叉树的结点个数
intheight();
//返回二叉树的高度
voidpreOrder();
//先根次序遍历二叉树
voidinOrder();
//中根次序遍历二叉树
voidpostOrder();
//后根次序遍历二叉树
voidlevelOrder();
//按层次遍历二叉树
BinaryNode<
search(Tkey);
//查找并返回首次出现的关键字为key元素结点
getParent(BinaryNode<
node);
//返回node的父母结点
voidinsertRoot(Tx);
//插入元素x作为根节点
insertChild(BinaryNode<
p,Tx,booleanleftChild);
//插入孩子节点
voidremoveChild(BinaryNode<
p,booleanleftChild);
//删除p结点的左或右子树
voidremoveAll();
//删除二叉树
}
(2)二叉链表结点类BinaryNode.java
publicclassBinaryNode<
{//二叉树的二叉链表结点类
publicTdata;
//数据域,存储数据元素
publicBinaryNode<
left,right;
//链域,分别指向左、右孩子结点
//构造结点,参数分别指定元素和左、右孩子结点
publicBinaryNode(Tdata,BinaryNode<
left,BinaryNode<
right){
this.data=data;
this.left=left;
this.right=right;
}
publicBinaryNode(Tdata){this(data,null,null);
}//构造指定值的叶子节点
publicBinaryNode(){this(null,null,null);
(3)二叉树类BinaryTree.java
//二叉树类,实现BinaryTree<
接口,泛型T指定节点的元素类型
publicclassBinaryTree<
implementsBinaryTTree<
{
root;
publicBinaryTree(){this.root=null;
publicbooleanisEmpty(){
returnthis.root==null;
publicintcount(){returncount(root);
publicintcount(BinaryNode<
p){
if(p==null)
return0;
return1+count(p.left)+count(p.right);
publicintheight(){returnheight(root);
publicintheight(BinaryNode<
if(p==null)
intlh=height(p.left);
intrh=height(p.right);
return(lh>
rh)?
lh+1:
rh+1;
publicvoidpreOrder(){
System.out.print("
先根次序遍历:
"
);
preOrder(root);
System.out.println();
publicvoidpreOrder(BinaryNode<
if(p!
=null){
System.out.print(p.data.toString()+"
preOrder(p.left);
preOrder(p.right);
}
publicvoidinOrder(){
中根次序遍历:
inOrder(root);
publicvoidinOrder(BinaryNode<
if(p!
=null){
inOrder(p.left);
inOrder(p.right);
publicvoidpostOrder(){
后根次序遍历:
postOrder(root);
publicvoidpostOrder(BinaryNode<
postOrder(p.left);
postOrder(p.right);
publicvoidlevelOrder(){//按层次遍历二叉树
LinkedQueue<
BinaryNode<
>
que=newLinkedQueue<
();
//创建空队列
BinaryNode<
p=this.root;
层次遍历:
while(p!
System.out.print(p.data+"
if(p.left!
=null)
que.enqueue(p.left);
//p的左孩子结点入队
if(p.right!
que.enqueue(p.right);
//p的右孩子结点入队
p=que.dequeue();
//p指向出队结点,若队列空返回null
(4)使用二叉树UseBinaryTree.java
importjava.util.Scanner;
/**
*
*@authorpang
*
*/
publicclassUseBinaryTree{
publicstaticBinaryTree<
String>
make(Stringa,Stringb,Stringc,Stringd,Stringe,Stringf,Stringg,Stringh){
BinaryTree<
bitree=newBinaryTree<
child_f,child_d,child_b,child_c;
child_d=newBinaryNode<
(d,null,newBinaryNode<
(g));
child_b=newBinaryNode<
(b,child_d,null);
child_f=newBinaryNode<
(f,newBinaryNode<
(h),null);
child_c=newBinaryNode<
(c,newBinaryNode<
(e),child_f);
bitree.root=newBinaryNode<
(a,child_b,child_c);
returnbitree;
publicstaticvoidmain(Stringargs[]){
System.out.println("
请输入结点数据:
"
Scannerscan=newScanner(System.in);
Stringa=scan.next();
Stringb=scan.next();
Stringc=scan.next();
Stringd=scan.next();
Stringe=scan.next();
Stringf=scan.next();
Stringg=scan.next();
Stringh=scan.next();
bitree=make(a,b,c,d,e,f,g,h);
1--先序遍历\n2--中序遍历\n3--后序遍历\n4--层次遍历\n5--求结点总数\n6--求高度\n0--退出"
输入菜单选项,进行相应操作并输出结果"
while(true){
intnumber=scan.nextInt();
operate(bitree,number);
//菜单功能方法
publicstaticvoidoperate(BinaryTree<
bitree,inta){
switch(a){
case1:
bitree.preOrder();
break;
case2:
bitree.inOrder();
case3:
bitree.postOrder();
case4:
bitree.levelOrder();
case5:
System.out.println("
二叉树结点数:
+bitree.count());
case6:
二叉树高度:
+bitree.height());
case0:
System.exit(0);
default:
请正确输入指令!
(5)注意事项
二叉树类BinaryTree.java中有用到队列部分内容,需要导入包或者将该部分文件放入tree包中才能使用
(6)运行结果:
2.哈夫曼树
(1)二叉树的静态三叉链表结点类TriElement.java
packagehuffman;
publicclassTriElement{//二叉树的三叉静态链表结点类
intdata;
//数据域,表示权值
intparent,left,right;
//父母结点和左、右孩子结点下标
publicTriElement(intdata,intparent,intleft,intright){
this.parent=parent;
publicTriElement(intdata){this(data,-1,-1,-1);
publicTriElement(){this(0);
publicStringtoString(){return"
("
+this.data+"
"
+this.parent+"
+this.left+"
+this.right+"
)"
;
(2)哈夫曼树类HuffmanTree.java
publicclassHuffmanTree{//Huffman树
privateintleafNum;
//叶子结点
privateTriElement[]huftree;
//Huffman树的结点数组
publicHuffmanTree(int[]weight){//构造指定权值集合的Huffman树
intn=weight.length;
//n个叶子结点
this.leafNum=n;
this.huftree=newTriElement[2*n-1];
//n个叶子结点的Huffman树共有2n-1个结点
for(inti=0;
i<
n;
i++)//结点数组初始化有n个叶子结点
this.huftree[i]=newTriElement(weight[i]);
n-1;
i++){//构造n-1个2度将结点,每次循环构造1个2度结点
intmin1=Integer.MAX_VALUE,min2=min1;
//最小和次最小权值,初值为整数最大值
intx1=-1,x2=-1;
//记录两个无父母的最小权值结点下标
for(intj=0;
j<
n+i;
j++)//查找两个无父母的最小权值结点
if(huftree[j].data<
min1&
&
huftree[j].parent==-1){
min2=min1;
x2=x1;
min1=huftree[j].data;
//min1记下最小权值
x1=j;
//x1记下最小权值结点的下标
}
elseif(huftree[j].data<
min2&
min2=huftree[j].data;
x2=j;
//x2记下次最小权值结点的下标
huftree[x1].parent=n+i;
//将找出的两棵权值最小的子树合并为一棵子树
huftree[x2].parent=n+i;
this.huftree[n+i]=newTriElement(huftree[x1].data+huftree[x2].data,-1,x1,x2);
publicStringtoString(){
Stringstr="
Huffman树的结点数组:
\n"
this.huftree.length&
huftree[i]!
=null;
i++)
str+="
第"
+i+"
行"
+this.huftree[i].toString()+"
returnstr;
publicString[]huffmanCodes(){//返回当前Huffman树的Huffman编码
String[]hufcodes=newString[this.leafNum];
this.leafNum;
i++){//求n个叶子结点的Huffman编码
hufcodes[i]="
intchild=i;
intparent=huftree[child].parent;
while(parent!
=-1){//由叶子结点向上直到根节点循环
if(huftree[parent].left==child)
hufcodes[i]="
0"
+hufcodes[i];
//左孩子结点编码为0
else
1"
//右孩子结点编码为1
child=parent;
parent=huftree[child].parent;
}
returnhufcodes;
(3)获取哈夫曼编码HuffmanTree_example.java
importJosephus.SeqList;
publicclassHuffmanTree_example{
SeqList<
Integer>
list=newSeqList<
请依次输入权值并以0结束作为标识"
while(true){
intx=scan.nextInt();
if(x!
=0)
list.append(x);
else
break;
int[]weight=newint[list.length()];
for(inti=0;
list.length();
i++){
weight[i]=list.get(i);
HuffmanTreehtree=newHuffmanTree(weight);
System.out.print(htree.toString());
String[]code=htree.huffmanCodes();
Huffman编码:
\n"
code.length;
System.out.println((char)('
A'
+i)+"
:
+code[i]+"
(4)注意事项
从键盘输入权值且不确定个数,需要一个标识符,这里用了0作为标识符。
使用到了线性表部分内容,需要导入包或将文件放入此包中。
(5)运行结果:
3.二叉树的中序线索化
(1)二叉链表结点类ThreadNode.java
packagethreadBinaryTree;
publicclassThreadNode<
publicThreadNode<
publicintltag,rtag;
publicThreadNode(Tdata,ThreadNode<
left,intltag,ThreadNode<
right,intrtag){
this.ltag=ltag;
this.rtag=rtag;
publicThreadNode(Tdata){this(data,null,0,null,0);
publicThreadNode(){this(null,null,0,null,0);
(2)中序线索二叉树类ThreadBinaryTree.java
publicclassThreadBinaryTree<
publicThreadBinaryTree(){
this.root=null;
publicbooleanisEmpty(){
returnroot==null;
publicThreadBinaryTree(T[]prelist){
this.root=create(prelist);
inorderThread(this.root);
privateinti=0;
privateThreadNode<
create(T[]prelist){
ThreadNode<
p=null;
if(i<
prelist.length){
Telem=prelist[i++];
if(elem!
=null){
p=newThreadNode<
(elem);
p.left=create(prelist);
p.right=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉 纺织 大学 数据结构 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)