本博客将以代码的形式详细讲解二叉树的所有算法,包括创建二叉树,二叉树的三种遍历方式,二叉树的各种属性算法,如:求高度,求叶子节点数,求节点数,以及二叉树最常见的应用哈夫曼树,代码如下:

# include<stdio.h>
# include<string.h>
# include<conio.h>
# include<stdlib.h>
# define N 1
# define M 2*N-1
typedef char * HC[N+1];
typedef struct bt
{char x;struct bt *lchild;struct bt *rchild;
}bt,*pbt;
typedef struct
{int parent;int weight, lchild, rchild;
}HT[M+1];
void creatbt(pbt *root)
{char ch=getchar();if(ch==' ')*root=NULL;else{*root=(pbt)malloc(sizeof(bt));(*root)->x=ch;creatbt(&((*root)->lchild));creatbt(&((*root)->rchild));}
}
void preorder(pbt root)
{if(root!=NULL){printf("%c",root->x);preorder(root->lchild);preorder(root->rchild);}
}
void inorder(pbt root)
{if(root!=NULL){inorder(root->lchild);printf("%c",root->x);inorder(root->rchild);}
}
void postorder(pbt root)
{if(root!=NULL){postorder(root->lchild);postorder(root->rchild);printf("%c",root->x);}
}
int btdepth(pbt root,int h)
{static int depth=0;if(root!=NULL){if(h>depth) depth=h;btdepth(root->lchild,h+1);btdepth(root->rchild,h+1);}return depth;
}
int nodenum(pbt root)
{static int n=0;if(root!=NULL){ n++;nodenum(root->lchild);nodenum(root->rchild);}return n;
}
int leafnum(pbt root)
{static int n=0;if(root!=NULL){leafnum(root->lchild);leafnum(root->rchild);if((root->lchild==NULL)&&(root->rchild==NULL))n++;}return n;
}
void select(HT ht,int n,int *x,int *y)
{int i,min1=100,min2=200;for(i=1;i<=n;i++){if(ht[i].parent==0&&ht[i].weight<min1){min1=ht[i].weight;*x=i;}}for(i=1;i<=n;i++){if(ht[i].parent==0&&ht[i].weight<min2&&i!=*x){min2=ht[i].weight;*y=i;}}}
void hafuman(HT ht,int w[],int n)
{int i,k,m,x,y;for(i=1;i<=n;i++){ht[i].weight=w[i];ht[i].parent=ht[i].lchild=ht[i].rchild=0;}m=2*n-1;for(i=n+1;i<=m;i++){ht[i].parent=ht[i].lchild=ht[i].rchild=0;}for(i=n+1;i<=m;i++){select(ht,i-1,&x,&y);//选择parent为0且权值最小的结点ht[i].weight=ht[x].weight+ht[y].weight;ht[i].lchild=x;ht[i].rchild=y;ht[x].parent=ht[y].parent=i;}
}
void hafumancode(HT ht,HC hc,int n)
{int i,c,p,start;char * cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';//此处的cd用来存储当前哈夫曼码,可供循环利用,相当于一个暂存器for(i=1;i<=n;i++)//求n个叶子结点的哈夫曼码{start=n-1;c=i;//因为下面会循环更新孩子结点,所以不能用i(否则第一次for循环后i可能就不再是1),可将i的值提前赋给cp=ht[i].parent;while(p!=0)//只要p不是根结点{start--;//此语句用来循环更新存储下标if(ht[p].lchild==c)//cd[i]='0';//错误。注意应从叶子结点开始向上推cd[start]='0';else//cd[i]='1';cd[start]='1';c=p;//此语句用来循环更新孩子结点p=ht[p].parent;}hc[i]=(char *)malloc((n-start)*sizeof(char));strcpy(hc[i],&cd[start]);}free(cd);for(i=1;i<=n;i++){//printf("%d的哈夫曼码为%s\n",ht[i],hc[i]);错误,ht[i]为结构数组,应写其成员printf("%d的哈夫曼码为%s\n",ht[i].weight,hc[i]);}}
void main()
{int n;pbt root;printf("\t\t-----------------------------------------\n");printf("\t\t1.创建二叉树          2.遍历二叉树\n");printf("\t\t3.二叉树的属性        4.哈夫曼树\n");printf("\t\t5.退出\n");printf("\t\t-----------------------------------------\n");while(1){printf("请选择功能模块(1-5)\n");scanf("%d",&n);//char ch=getche();getchar();switch(n){case 1:{printf("请以先序扩展创建二叉树(空结点用空格代替)\n");creatbt(&root);}break;case 2:{printf("遍历二叉树\n");printf("\t\t[1]先序遍历\n");printf("\t\t[2]中序遍历\n");printf("\t\t[3]后序遍历\n");printf("\t\t[4]返回主菜单\n");while(1){int n;printf("请选择(1-4):\n");scanf("%d",&n);if(1==n)preorder(root);if(2==n)inorder(root);if(3==n)postorder(root);//else//不能这样写,因为这个else只能与上一个if配对,所以当n!=3时break都会执行if(n==4)break;}}break;case 3:{int h=1,n;printf("二叉树属性\n");printf("\t\t[1]二叉树高度\n");printf("\t\t[2]二叉树结点数\n");printf("\t\t[3]二叉树叶子结点\n");printf("\t\t[4]返回主菜单\n");while(1){printf("请选择:(1-4)\n");scanf("%d",&n);if(1==n)printf("该二叉树的高度为%d\n",btdepth(root,h));if(2==n)printf("该二叉树的结点数为%d\n",nodenum(root));if(3==n)printf("该二叉树的叶子结点数为%d\n",leafnum(root));if(n==4)break;}}break;case 4:{HT ht;HC hc;int n,i;printf("请输入叶子结点的个数\n");scanf("%d",&n);int * w=(int *)malloc((n+1)*sizeof(int));//此语句必须位于scanf的下面for(i=1;i<=n;i++){printf("请输入第%d个叶子结点的权值\n",i);scanf("%d",&w[i]);}hafuman(ht,w,n);hafumancode(ht,hc,n);}break;case 5:exit(1);}}}

程序运行结果如下:

注意对于同一个二叉树,哈夫曼码的结果不唯一,上述输出只是一种情况。

转载于:https://www.cnblogs.com/hainange/p/6334054.html

【二叉树系列】二叉树课程大作业相关推荐

  1. HTML网页设计期末课程大作业 :汽车网页——宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载

    HTML网页设计期末课程大作业 :汽车网页--宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载 临近期末, 你还在为HTML网页设计结课作 ...

  2. HTML网页设计期末课程大作业 :汽车网页——宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载...

    HTML网页设计期末课程大作业 :汽车网页--宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载 临近期末, 你还在为HTML网页设计结课作 ...

  3. HTML+CSS+JS网页设计期末课程大作业____(航天月球响应式 3页)

    ⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIV+CSS 布局制作,HTML+CSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 ...

  4. Bailian4149 课程大作业【DP】

    4149:课程大作业 总时间限制: 1000ms 内存限制: 65536kB 描述 小明是北京大学信息科学技术学院三年级本科生.他喜欢参加各式各样的校园社团.这个学期就要结束了,每个课程大作业的截止时 ...

  5. HTML网页设计期末课程大作业 ~中国茶文化5页面带轮播(HTML+CSS+JS)~ 学生网页设计作业源码...

    HTML网页设计期末课程大作业 ~ 中国茶文化5页面带轮播(HTML+CSS+JS)~ 学生网页设计作业源码 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从 ...

  6. HTML网页设计期末课程大作业 ~中国茶文化5页面带轮播(HTML+CSS+JS)~ 学生网页设计作业源码

    HTML网页设计期末课程大作业 ~ 中国茶文化5页面带轮播(HTML+CSS+JS)~ 学生网页设计作业源码 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从 ...

  7. 浙江万里学院期末计算机网络,(浙江万里学院云计算基础课程大作业封面.doc

    (浙江万里学院云计算基础课程大作业封面 浙江万里学院云计算基础课程论文封面 教师填写: 得分 任课教师签名 年 月 日 学生填写: 姓名 学号 所在学院计算机与信息学院专业信息工程课程名称云计算基础? ...

  8. web网页设计期末课程大作业~超高仿英雄联盟LOL游戏官网设计与实现(HTML+CSS+JavaScript)...

    仿英雄联盟LOL游戏官网设计与实现(HTML+CSS+JavaScript) 关于HTML期末网页制作,大作业A+水平 ~游戏网页作业HTML+CSS+JavaScript实现,共有游戏首页 等页面! ...

  9. 24HTML5期末大作业:XXX 网站设计——指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程 网页规

    HTML5期末大作业:XXX 网站设计--指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划 ...

  10. HTML5期末大作业:XXX 网站设计——指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规

    HTML5期末大作业:XXX 网站设计--指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划 ...

最新文章

  1. 重视细节,方能得到认可
  2. replace into
  3. 关于mysql触发器和存储过程的理解
  4. HDLBits答案(5)_Generate实例化模块
  5. vue+elementUI 显示表格指定列合计数据
  6. 读书笔记2014第10本:《设计心理学》
  7. lua mysql 事务_为什么在 Redis 实现 Lua 脚本事务?-阿里云开发者社区
  8. 腾讯2014实习北京笔试
  9. Android基于百度OCR识别图片中的文字
  10. 有没有永久免费的云服务器?看完这篇文章你就明白了!
  11. 华为ensp模拟校园网/企业网实例(附完整设备配置命令和ensp项目)
  12. Ansys Lumerical | 铌酸锂热调制波导仿真
  13. vue+element实现天翼云oos上传文件
  14. 使用苹果手机/PAD做树莓派的外接屏幕
  15. ZYNQ 常见问题解决方法
  16. 【雷达书籍推荐】 第2期 雷达原理
  17. conexant hd audio音频驱动
  18. Android程序员面试必须要掌握的:Https加密原理、中间人攻击到底是怎么回事
  19. 罗素问题 ——来自知乎大神
  20. [转载]计算机科学与技术学生学习基础材料参考

热门文章

  1. 汇编: dosbox命令
  2. 砥砺前行,不忘初心,我的运维学习之路.
  3. Nginx负载均衡和反向代理
  4. 「原创」马云又嗨啦,云栖音乐节与李健同台飙歌,把健哥都带跑调了
  5. Android IOS WebRTC 音视频开发总结(四二)-- webrtc开发者大会
  6. 银行业双活数据中心-F5在双活数据中心中的应用
  7. nginx的url重写[rewrite规则和参考]
  8. suse软件管理程序zypper
  9. .NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
  10. /usr/bin/install: cannot create regular file ‘/usr/local/lib/libpcre.so.1.2.13‘: Permission denied