二叉树算法验证
本次实践主要是对于二叉树算法的验证,达成对于算法熟练掌握的目的。
实践所用的二叉树算法库点击此处可以参考(编译环境:VC++6.0)

一、层次遍历算法验证
验证具体要求如下:
实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。
注:在main函数中,创建的用于测试的二叉树如下—— 
实现源代码:
//*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;
}
运行结果截图如下:
二、构造算法的验证
1、由先序和中序序列构造二叉树
实现源代码如下:
//*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;
}
运行结果截图如下:

2、由后序和中序序列构造二叉树
实现源代码如下:
//*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;
}

运行结果截图如下:

3、由顺序存储转成二叉链存储
实现源代码如下:
//*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 - 二叉树算法验证相关推荐

  1. 数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径

    二叉树排序树中查找的路径 项目要求如下: 设计一个算法,输出在二叉排序中查找时查找某个关键字经过的路径.  专为本项目设计的算法体现在函数int SearchBST(-)和void SearchRes ...

  2. 数据结构上机实践第八周项目9-广义表算法库及应用

    广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括:  ① 头文glist.h,定义数据类型,声明函数:  ② ...

  3. 数据结构上机实践第八周项目2- 建立链串的算法库

    建立链串的算法库 一般每一种数据结构都不会局限于在连续空间内的存取,那我们的串自然也不反常,本次实践将建立链串的算法库,应用于有需求的工程当中,提高程序的容错性. 本次实践依然会用到多文件组织工程的建 ...

  4. 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用

    稀疏矩阵的三元组表示的实现及应用 在现代社会中,在一个大量的人群集体中,总会有和某个人有相互之间的关系或者单向关系的,那我们的矩阵也是如此,稀疏矩阵压缩存储的方式,便可以让这种关系一目了然,巧妙应用. ...

  5. 数据结构上机实践第八周项目3-顺序串算法

    顺序串算法 本次实践项目要求如下: 采用顺序存储方式存储串,实现下列算法并测试:  (1)试编写算法实现将字符串S中所有值为c1的字符换成值为c2的字符:  void Trans(SqString * ...

  6. 数据结构上机实践第八周项目1- 建立顺序串的算法库

    建立顺序串的算法库 本次实践将建立顺序串的算法库,这样可以方便的将此算法运用于我们的所需的工程中,简化操作. 本次实践将用到多文件组织工程的建立,建立方法可以点击此处参照.(工程环境:Visual C ...

  7. 数据结构上机实践第三周项目2 - 建设“顺序表”算法库

    [项目2 - 建设"顺序表"算法库]  领会"0207将算法变程序"部分建议的方法,建设自己的专业基础设施算法库.这一周,建的是顺序表的算法库.  算法库包括两 ...

  8. 数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列

    自建算法库--顺序环形队列 本次实践将建立顺序环形队列的算法库,用于之后的工程中 实现源代码如下: 1.squeue.h /* copyright (t) 2017,烟台大学计算机学院 *All ri ...

  9. 数据结构上机实践第14周项目3 - 是否二叉排序树

    是否二叉排序树? 项目要求如下: 设计一个算法,判断给定的二叉树是否是二叉排序树. int JudgeBST()是设计的算法对应的实现. 实现源代码如下: //*Copyright (c)2017,烟 ...

最新文章

  1. 循环获取结构体中的健名与值的实现
  2. hdu 2063+hdu 1083(最大匹配数)
  3. leetcode算法题--Combinations
  4. Activemq 安全机制以及稳定性研究
  5. Winfrom实用代码项目
  6. Eclipse使用时的一些小积累
  7. 今天学习啦所谓的高级语言啦
  8. CodeSmith 注册
  9. opencv多通道图像转单通道
  10. EXcel中如何做一个组合统计图?
  11. 数字签名(Digital Signature)
  12. [检索方法]——USPTO美国专利及商标局(1)
  13. 关于 SAP ABAP 报表的多语言显示问题试读版
  14. 常用的ddos防护方式
  15. 探索Ristretto量化工程—问题记录
  16. 用for循环输出俄文的“字母表”
  17. 博士毕业感悟:我从来不曾优秀过,也从未曾放弃过!
  18. [附源码]计算机毕业设计JAVA户籍管理系统
  19. 嵌入式 LINUX 应用开发
  20. Linux(本笔记基于的版本为Ubuntu 14.04)- 24 管道

热门文章

  1. C#基础8:类的继承
  2. bzoj 1264: [AHOI2006]基因匹配Match(树状数组)
  3. python基础系列教程——python面向对象编程全解
  4. AD19调出网络连接的虚线
  5. dell 服务器r410装系统,dell r410安装windows2003系统
  6. Eclipse 配置
  7. CognitiveJ一个Java的人脸图像识别开源分析库
  8. 1. 少了一个PermMissingElem Find the missing element in a given permutation.
  9. dos中进入其他盘中的方法
  10. [杂谈] 2013年新目标