数据结构上机实践第10周项目1 - 二叉树算法验证
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年11月9日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include "btree.h"void LevelOrder(BTNode *b)
{BTNode *p;BTNode *qu[MaxSize]; //定义环形队列,存放节点指针int front,rear; //定义队头和队尾指针front=rear=-1; //置队列为空队列rear++;qu[rear]=b; //根节点指针进入队列while (front!=rear) //队列不为空{front=(front+1)%MaxSize;p=qu[front]; //队头出队列printf("%c ",p->data); //访问节点if (p->lchild!=NULL) //有左孩子时将其进队{rear=(rear+1)%MaxSize;qu[rear]=p->lchild;}if (p->rchild!=NULL) //有右孩子时将其进队{rear=(rear+1)%MaxSize;qu[rear]=p->rchild;}}
}int main()
{BTNode *b;CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");printf("二叉树b: ");DispBTNode(b);printf("\n");printf("层次遍历序列:\n");LevelOrder(b);DestroyBTNode(b);return 0;
}
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年11月9日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include <malloc.h>
#include "btree.h"BTNode *CreateBT1(char *pre,char *in,int n)
/*pre存放先序序列,in存放中序序列,n为二叉树结点个数,
本算法执行后返回构造的二叉链的根结点指针*/
{BTNode *s;char *p;int k;if (n<=0) return NULL;s=(BTNode *)malloc(sizeof(BTNode)); //创建二叉树结点*ss->data=*pre;for (p=in; p<in+n; p++) //在中序序列中找等于*ppos的位置kif (*p==*pre) //pre指向根结点break; //在in中找到后退出循环k=p-in; //确定根结点在in中的位置s->lchild=CreateBT1(pre+1,in,k); //递归构造左子树s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树return s;
}int main()
{ElemType pre[]="ABDGCEF",in[]="DGBAECF";BTNode *b1;b1=CreateBT1(pre,in,7);printf("b1:");DispBTNode(b1);printf("\n");return 0;
}
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年11月9日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include <malloc.h>
#include "btree.h"BTNode *CreateBT2(char *post,char *in,int n)
/*post存放后序序列,in存放中序序列,n为二叉树结点个数,
本算法执行后返回构造的二叉链的根结点指针*/
{BTNode *s;char r,*p;int k;if (n<=0) return NULL;r=*(post+n-1); //根结点值s=(BTNode *)malloc(sizeof(BTNode)); //创建二叉树结点*ss->data=r;for (p=in; p<in+n; p++) //在in中查找根结点if (*p==r)break;k=p-in; //k为根结点在in中的下标s->lchild=CreateBT2(post,in,k); //递归构造左子树s->rchild=CreateBT2(post+k,p+1,n-k-1); //递归构造右子树return s;
}int main()
{ElemType in[]="DGBAECF",post[]="GDBEFCA";BTNode *b2;b2=CreateBT2(post,in,7);printf("b2:");DispBTNode(b2);printf("\n");return 0;
}
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年11月9日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include <malloc.h>
#include "btree.h"
#define N 30
typedef ElemType SqBTree[N];
BTNode *trans(SqBTree a,int i)
{BTNode *b;if (i>N)return(NULL);if (a[i]=='#')return(NULL); //当节点不存在时返回NULLb=(BTNode *)malloc(sizeof(BTNode)); //创建根节点b->data=a[i];b->lchild=trans(a,2*i); //递归创建左子树b->rchild=trans(a,2*i+1); //递归创建右子树return(b); //返回根节点
}
int main()
{BTNode *b;ElemType s[]="0ABCD#EF#G####################";b=trans(s,1);printf("b:");DispBTNode(b);printf("\n");return 0;
}
#include <stdio.h>
#include <malloc.h>#define MaxSize 100
typedef char ElemType;
typedef struct node
{ElemType data;int ltag,rtag; //增加的线索标记struct node *lchild;struct node *rchild;
} TBTNode;void CreateTBTNode(TBTNode * &b,char *str)
{TBTNode *St[MaxSize],*p=NULL;int top=-1,k,j=0;char ch;b=NULL; //建立的二叉树初始时为空ch=str[j];while (ch!='\0') //str未扫描完时循环{switch(ch){case '(':top++;St[top]=p;k=1;break; //为左结点case ')':top--;break;case ',':k=2;break; //为右结点default:p=(TBTNode *)malloc(sizeof(TBTNode));p->data=ch;p->lchild=p->rchild=NULL;if (b==NULL) //*p为二叉树的根结点b=p;else //已建立二叉树根结点{switch(k){case 1:St[top]->lchild=p;break;case 2:St[top]->rchild=p;break;}}}j++;ch=str[j];}
}void DispTBTNode(TBTNode *b)
{if (b!=NULL){printf("%c",b->data);if (b->lchild!=NULL || b->rchild!=NULL){printf("(");DispTBTNode(b->lchild);if (b->rchild!=NULL) printf(",");DispTBTNode(b->rchild);printf(")");}}
}TBTNode *pre; //全局变量void Thread(TBTNode *&p)
{if (p!=NULL){Thread(p->lchild); //左子树线索化if (p->lchild==NULL) //前驱线索{p->lchild=pre; //建立当前结点的前驱线索p->ltag=1;}else p->ltag=0;if (pre->rchild==NULL) //后继线索{pre->rchild=p; //建立前驱结点的后继线索pre->rtag=1;}else pre->rtag=0;pre=p;Thread(p->rchild); //右子树线索化}
}TBTNode *CreaThread(TBTNode *b) //中序线索化二叉树
{TBTNode *root;root=(TBTNode *)malloc(sizeof(TBTNode)); //创建根结点root->ltag=0;root->rtag=1;root->rchild=b;if (b==NULL) //空二叉树root->lchild=root;else{root->lchild=b;pre=root; //pre是*p的前驱结点,供加线索用Thread(b); //中序遍历线索化二叉树pre->rchild=root; //最后处理,加入指向根结点的线索pre->rtag=1;root->rchild=pre; //根结点右线索化}return root;
}void ThInOrder(TBTNode *tb)
{TBTNode *p=tb->lchild; //指向根结点while (p!=tb){while (p->ltag==0) p=p->lchild;printf("%c ",p->data);while (p->rtag==1 && p->rchild!=tb){p=p->rchild;printf("%c ",p->data);}p=p->rchild;}
}int main()
{TBTNode *b,*tb;CreateTBTNode(b,"A(B(D(,G)),C(E,F))");printf(" 二叉树:");DispTBTNode(b);printf("\n");tb=CreaThread(b);printf(" 线索中序序列:");ThInOrder(tb);printf("\n");return 0;
}
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年11月9日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include <string.h>#define N 50 //叶子结点数
#define M 2*N-1 //树中结点总数//哈夫曼树的节点结构类型
typedef struct
{char data; //结点值double weight; //权重int parent; //双亲结点int lchild; //左孩子结点int rchild; //右孩子结点
} HTNode;//每个节点哈夫曼编码的结构类型
typedef struct
{char cd[N]; //存放哈夫曼码int start;
} HCode;//构造哈夫曼树
void CreateHT(HTNode ht[],int n)
{int i,k,lnode,rnode;double min1,min2;for (i=0; i<2*n-1; i++) //所有结点的相关域置初值-1ht[i].parent=ht[i].lchild=ht[i].rchild=-1;for (i=n; i<2*n-1; i++) //构造哈夫曼树{min1=min2=32767; //lnode和rnode为最小权重的两个结点位置lnode=rnode=-1;for (k=0; k<=i-1; k++)if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找{if (ht[k].weight<min1){min2=min1;rnode=lnode;min1=ht[k].weight;lnode=k;}else if (ht[k].weight<min2){min2=ht[k].weight;rnode=k;}}ht[i].weight=ht[lnode].weight+ht[rnode].weight;ht[i].lchild=lnode;ht[i].rchild=rnode;ht[lnode].parent=i;ht[rnode].parent=i;}
}//实现哈夫曼编码
void CreateHCode(HTNode ht[],HCode hcd[],int n)
{int i,f,c;HCode hc;for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码{hc.start=n;c=i;f=ht[i].parent;while (f!=-1) //循序直到树根结点{if (ht[f].lchild==c) //处理左孩子结点hc.cd[hc.start--]='0';else //处理右孩子结点hc.cd[hc.start--]='1';c=f;f=ht[f].parent;}hc.start++; //start指向哈夫曼编码最开始字符hcd[i]=hc;}
}//输出哈夫曼编码
void DispHCode(HTNode ht[],HCode hcd[],int n)
{int i,k;double sum=0,m=0;int j;printf(" 输出哈夫曼编码:\n"); //输出哈夫曼编码for (i=0; i<n; i++){j=0;printf(" %c:\t",ht[i].data);for (k=hcd[i].start; k<=n; k++){printf("%c",hcd[i].cd[k]);j++;}m+=ht[i].weight;sum+=ht[i].weight*j;printf("\n");}printf("\n 平均长度=%g\n",1.0*sum/m);
}int main()
{int n=8,i; //n表示初始字符串的个数char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1};HTNode ht[M];HCode hcd[N];for (i=0; i<n; i++){ht[i].data=str[i];ht[i].weight=fnum[i];}printf("\n");CreateHT(ht,n);CreateHCode(ht,hcd,n);DispHCode(ht,hcd,n);printf("\n");return 0;
}
数据结构上机实践第10周项目1 - 二叉树算法验证相关推荐
- 数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
二叉树排序树中查找的路径 项目要求如下: 设计一个算法,输出在二叉排序中查找时查找某个关键字经过的路径. 专为本项目设计的算法体现在函数int SearchBST(-)和void SearchRes ...
- 数据结构上机实践第八周项目9-广义表算法库及应用
广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括: ① 头文glist.h,定义数据类型,声明函数: ② ...
- 数据结构上机实践第八周项目2- 建立链串的算法库
建立链串的算法库 一般每一种数据结构都不会局限于在连续空间内的存取,那我们的串自然也不反常,本次实践将建立链串的算法库,应用于有需求的工程当中,提高程序的容错性. 本次实践依然会用到多文件组织工程的建 ...
- 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用
稀疏矩阵的三元组表示的实现及应用 在现代社会中,在一个大量的人群集体中,总会有和某个人有相互之间的关系或者单向关系的,那我们的矩阵也是如此,稀疏矩阵压缩存储的方式,便可以让这种关系一目了然,巧妙应用. ...
- 数据结构上机实践第八周项目3-顺序串算法
顺序串算法 本次实践项目要求如下: 采用顺序存储方式存储串,实现下列算法并测试: (1)试编写算法实现将字符串S中所有值为c1的字符换成值为c2的字符: void Trans(SqString * ...
- 数据结构上机实践第八周项目1- 建立顺序串的算法库
建立顺序串的算法库 本次实践将建立顺序串的算法库,这样可以方便的将此算法运用于我们的所需的工程中,简化操作. 本次实践将用到多文件组织工程的建立,建立方法可以点击此处参照.(工程环境:Visual C ...
- 数据结构上机实践第三周项目2 - 建设“顺序表”算法库
[项目2 - 建设"顺序表"算法库] 领会"0207将算法变程序"部分建议的方法,建设自己的专业基础设施算法库.这一周,建的是顺序表的算法库. 算法库包括两 ...
- 数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列
自建算法库--顺序环形队列 本次实践将建立顺序环形队列的算法库,用于之后的工程中 实现源代码如下: 1.squeue.h /* copyright (t) 2017,烟台大学计算机学院 *All ri ...
- 数据结构上机实践第14周项目3 - 是否二叉排序树
是否二叉排序树? 项目要求如下: 设计一个算法,判断给定的二叉树是否是二叉排序树. int JudgeBST()是设计的算法对应的实现. 实现源代码如下: //*Copyright (c)2017,烟 ...
最新文章
- 循环获取结构体中的健名与值的实现
- hdu 2063+hdu 1083(最大匹配数)
- leetcode算法题--Combinations
- Activemq 安全机制以及稳定性研究
- Winfrom实用代码项目
- Eclipse使用时的一些小积累
- 今天学习啦所谓的高级语言啦
- CodeSmith 注册
- opencv多通道图像转单通道
- EXcel中如何做一个组合统计图?
- 数字签名(Digital Signature)
- [检索方法]——USPTO美国专利及商标局(1)
- 关于 SAP ABAP 报表的多语言显示问题试读版
- 常用的ddos防护方式
- 探索Ristretto量化工程—问题记录
- 用for循环输出俄文的“字母表”
- 博士毕业感悟:我从来不曾优秀过,也从未曾放弃过!
- [附源码]计算机毕业设计JAVA户籍管理系统
- 嵌入式 LINUX 应用开发
- Linux(本笔记基于的版本为Ubuntu 14.04)- 24 管道
热门文章
- C#基础8:类的继承
- bzoj 1264: [AHOI2006]基因匹配Match(树状数组)
- python基础系列教程——python面向对象编程全解
- AD19调出网络连接的虚线
- dell 服务器r410装系统,dell r410安装windows2003系统
- Eclipse 配置
- CognitiveJ一个Java的人脸图像识别开源分析库
- 1. 少了一个PermMissingElem Find the missing element in a given permutation.
- dos中进入其他盘中的方法
- [杂谈] 2013年新目标