树实验代码

哈夫曼树

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100typedef struct {int weight;int lchild, rchild, parent;
} HTNode;typedef HTNode HT[MAXLEN];
int n;void CreatHFMT(HT T);
void InitHFMT(HT T);
void InputWeight(HT T);
void SelectMin(HT T, int i, int *p1, int *p2);
void PrintHFMT(HT T);
void hfnode(HT T, int i, int j);
void haffmannode(HT T);int main() {HT HT;CreatHFMT(HT);PrintHFMT(HT);haffmannode(HT);return 0;
}void CreatHFMT(HT T) {int i, p1, p2;InitHFMT(T);InputWeight(T);for (i = n; i < 2 * n - 1; i++) {SelectMin(T, i - 1, &p1, &p2);T[p1].parent = T[p2].parent = i;T[i].lchild = p1;T[i].rchild = p2;T[i].weight = T[p1].weight + T[p2].weight;}
}void InitHFMT(HT T) {int i;printf("\n请输入共有多少个权值(小于100):");scanf("%d", &n);for (i = 0; i < 2 * n - 1; i++) {T[i].weight = 0;T[i].lchild = -1;T[i].rchild = -1;T[i].parent = -1;}
}void InputWeight(HT T) {int w, i;for (i = 0; i < n; i++) {printf("输入第%d个权值:", i + 1);scanf("%d", &w);getchar();T[i].weight = w;}
}void SelectMin(HT T, int i, int *p1, int *p2) {long min1 = 888888, min2 = 888888;int j;for (j = 0; j <= i; j++) {if (T[j].parent == -1) {if (min1 > T[j].weight) {min1 = T[j].weight;*p1 = j;}}}for (j = 0; j <= i; j++) {if (T[j].parent == -1) {if (min2 > T[j].weight && j != (*p1)) {min2 = T[j].weight;*p2 = j;}}}
}void PrintHFMT(HT T) {int i;printf("哈夫曼树的各边显示:\n");for (i = 0; i < 2 * n - 1; i++) {if (T[i].lchild != -1) {printf("(%d,%d),(%d,%d)\n", T[i].weight, T[T[i].lchild].weight, T[i].weight, T[T[i].rchild].weight);}}
}void hfnode(HT T, int i, int j) {j = T[i].parent;if (T[j].rchild == i) {printf("1");} else {printf("0");}if (T[j].parent != -1) {hfnode(T, j, i);}
}void haffmannode(HT T) {int i, j;printf("\n输入权值的对应哈夫曼编码:\n");for (i = 0; i < n; i++) {printf("%d的编码为: ", T[i].weight);hfnode(T, i, -1); // -1 表示递归的初始状态printf("\n");}printf("\n ");
}

运行结果

二叉树

#include <stdio.h>
#include <malloc.h>
#define  MAX  100
int  count = 0;                   /*定义计算结点个数的变量*/
typedef  struct  tnode
{char  data;struct  tnode* lchild, * rchild;
}BT;BT* CreateBTree()
{BT* t;char  ch;scanf("%c", &ch);getchar();if (ch == '0')t = NULL;else{t = (BT*)malloc(sizeof(BT));t->data = ch;printf("请输入%c结点的左孩子结点:", t->data);t->lchild = CreateBTree();printf("请输入%c结点的右孩子结点:", t->data);t->rchild = CreateBTree();}return  t;
}void ShowBTree(BT* T)                     /*用广义表表示法显示二叉树*/
{if (T != NULL)                          /*当二叉树非空时*/{printf("%c", T->data);             /*输入该结点数据域*/if (T->lchild != NULL)               /*若其左子树非空*/{printf("(");                  /*输入左括号*/ShowBTree(T->lchild);         /*递归调用该函数输出其左子树各结点*/if (T->rchild != NULL)           /*若其右子树非空*/{printf(",");             /*输出逗号*/ShowBTree(T->rchild);    /*递归调用该函数输出其右子树各结点*/}printf(")");}elseif (T->rchild != NULL)              /*二叉树左子树为空,右子树不为空时*/{printf("(");                  /*输入左括号*/ShowBTree(T->lchild);         /*递归调用该函数输出其左子树各结点*/if (T->rchild != NULL)           /*若其右子树非空*/{printf(",");              /*输出逗号*/ShowBTree(T->rchild);     /*递归调用该函数输出其右子树各结点*/}printf(")");}}
}void  PreOrder(BT* T)                      /* 先序遍历二叉树T*/
{if (T == NULL)  return;                    /* 递归调用的结束条件*/else{printf("%c", T->data);                /* 输出结点的数据域*/PreOrder(T->lchild);                 /* 先序递归遍历左子树*/PreOrder(T->rchild);                 /* 先序递归遍历右子树*/}
}void  InOrder(BT* T)                       /* 中序遍历二叉树T*/
{if (T == NULL) return;                       /* 递归调用的结束条件*/else{InOrder(T->lchild);                    /* 中序递归遍历左子树*/printf("%c", T->data);                  /* 输出结点的数据域*/InOrder(T->rchild);                    /* 中序递归遍历右子树*/}
}void  PostOrder(BT* T)                      /* 后序遍历二叉树T*/
{if (T == NULL) return;                     /* 递归调用的结束条件*/else{PostOrder(T->lchild);                 /* 后序递归遍历左子树*/PostOrder(T->rchild);                 /* 后序递归遍历右子树*/printf("%c", T->data);                 /* 输出结点的数据域*/}
}void LevelOrder(BT* T)                      /*按层次遍历二叉树T*/
{int  f, r;                                /*定义队头队尾指针*/BT* p, * q[MAX];                          /*定义循环队列,存放结点指针*/p = T;if (p != NULL)                              /*若二叉树非空,则根结点地址入队*/{f = 1;  q[f] = p; r = 2;}while (f != r)                              /*队列不空时*/{p = q[f];printf("%c", p->data);                 /*访问队首结点的数据域*/if (p->lchild != NULL)                   /*将队首结点的左孩子入队*/{q[r] = p->lchild;  r = (r + 1) % MAX;}if (p->rchild != NULL)                   /*将队首结点的右孩子入队*/{q[r] = p->rchild;  r = (r + 1) % MAX;}f = (f + 1) % MAX;}
}void  Leafnum(BT* T)                                   /*求二叉树叶子结点数*/
{if (T)                                              /*若树不为空*/{if (T->lchild == NULL && T->rchild == NULL)count++;                                         /*全局变量count为计数值,其初值为0*/Leafnum(T->lchild);                                  /*递归统计T的左子树叶子结点数*/Leafnum(T->rchild);                                  /*递归统计T的右子树叶子结点数*/}
}void  Nodenum(BT* T)
{if (T)                                   /*若树不为空*/{count++;                            /*全局变量count为计数值,其初值为0*/Nodenum(T->lchild);                 /*递归统计T的左子树结点数*/Nodenum(T->rchild);                 /*递归统计T的右子树结点数*/}
}int  TreeDepth(BT* T)                      /*求二叉树深度*/
{int  ldep = 0, rdep = 0;                     /*定义两个整型变量,用以存放左、右子树的深度*/if (T == NULL)return  0;else{ldep = TreeDepth(T->lchild);          /*递归统计T的左子树深度*/rdep = TreeDepth(T->rchild);          /*递归统计T的右子树深度*/if (ldep > rdep)return  ldep + 1;elsereturn  rdep + 1;}
}void  MenuTree()                                     /*显示菜单子函数*/
{printf("\n                  二叉树子系统");printf("\n =================================================");printf("\n|               1——建立一个新二叉树            |");printf("\n|               2——广义表表示法显示            |");printf("\n|               3——先序遍历                    |");printf("\n|               4——中序遍历                    |");printf("\n|               5——后序遍历                    |");printf("\n|               6——层次遍历                    |");printf("\n|               7——求叶子结点数目              |");printf("\n|               8——求二叉树总结点数目          |");printf("\n|               9——求树深度                    |");printf("\n|               0——返回                        |");printf("\n ================================================");printf("\n请输入菜单号(0-9):");
}main()
{BT* T = NULL;char  ch1, ch2, a;ch1 = 'y';while (ch1 == 'y' || ch1 == 'Y'){MenuTree();scanf("%c", &ch2);getchar();switch (ch2){case  '1':printf("请按先序序列输入二叉树的结点:\n");printf("说明:输入结点后按回车('0'表示后继结点为空):\n");printf("请输入根结点:");T = CreateBTree();printf("二叉树成功建立!"); break;case  '2':printf("二叉树广义表表示法如下:");ShowBTree(T); break;case  '3':printf("二叉树的先序遍历序列为:");PreOrder(T); break;case  '4':printf("二叉树的中序遍历序列为:");InOrder(T); break;case  '5':printf("二叉树的后序遍历序列为:");PostOrder(T); break;case  '6':printf("二叉树的层次遍历序列为:");LevelOrder(T); break;case  '7':count = 0; Leafnum(T);printf("该二叉树有%d个叶子。", count); break;case  '8':count = 0; Nodenum(T);printf("该二叉树共有%d个结点。", count); break;case  '9':printf("该二叉树的深度是%d。", TreeDepth(T)); break;case  '0':ch1 = 'n'; break;default:printf("输入有误,请输入0-9进行选择!");}if (ch2 != '0'){printf("\n按回车键继续,按任意键返回主菜单!\n");a = getchar();if (a != '\xA'){getchar(); ch1 = 'n';}}}
}

 运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt开发流程】之UI风格、预览及QPalette使用

概述 一个优秀的应用程序不仅要有实用的功能&#xff0c;还要有一个漂亮美腻的外观&#xff0c;这样才能使应用程序更加友善、操作性良好&#xff0c;更加符合人体工程学。作为一个跨平台的UI开发框架&#xff0c;Qt提供了强大而且灵活的界面外观设计机制&#xff0c;能够帮助…

利用Rclone将阿里云对象存储迁移至雨云对象存储的教程,对象存储数据迁移教程

使用Rclone将阿里云对象存储(OSS)的文件全部迁移至雨云对象存储(ROS)的教程&#xff0c;其他的对象存储也可以参照本教程。 Rclone简介 Rclone 是一个用于和同步云平台同步文件和目录命令行工具。采用 Go 语言开发。 它允许在文件系统和云存储服务之间或在多个云存储服务之间…

STM32-EXTI外部中断

目录 一、中断系统 二、STM32中断 三、NVIC&#xff08;嵌套中断向量控制器&#xff09;基本结构 四、NVIC优先级分组 五、EXTI外部中断 5.1 外部中断基本知识 5.2 外部中断&#xff08;EXTI&#xff09;基本结构 ​编辑 5.2.1开发步骤&#xff1a; 5.3 AFIO复用IO口…

ADAudit Plus:强大的网络安全卫士

随着数字化时代的不断发展&#xff0c;企业面临着越来越复杂和多样化的网络安全威胁。在这个信息爆炸的时代&#xff0c;保护组织的敏感信息和确保网络安全已经成为企业发展不可或缺的一环。为了更好地管理和监控网络安全&#xff0c;ADAudit Plus应运而生&#xff0c;成为网络…

Redis分布式锁有什么缺陷?

Redis分布式锁有什么缺陷&#xff1f; Redis 分布式锁不能解决超时的问题&#xff0c;分布式锁有一个超时时间&#xff0c;程序的执行如果超出了锁的超时时间就会出现问题。 1.Redis容易产生的几个问题&#xff1a; 2.锁未被释放 3.B锁被A锁释放了 4.数据库事务超时 5.锁过期了…

centos 7 卸载图形化界面步骤记录

centos7 服务器操作系统&#xff0c;挺小一配置&#xff0c;装了图形化界面&#xff0c;现在运行程序的时候跑不动了&#xff0c;我想这图形界面也没啥用&#xff0c;卸载了算了&#xff01; 卸载步骤 yum grouplist 查询已经安装的组件 可以看到 图形化界面 等是以分组存在的…

TCP数据粘包的处理

TCP数据粘包的处理 背锅侠TCP解决方案2.1 发送端2.2 接收端 背锅侠TCP 在前面介绍套接字通信的时候说到了TCP是传输层协议&#xff0c;它是一个面向连接的、安全的、流式传输协议。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量&#xff0c;处理数据的频率可…

Qt练习题

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…

【Angular开发】Angular 16发布:发现前7大功能

Angular 于2023年5月3日发布了主要版本升级版Angular 16。作为一名Angular开发人员&#xff0c;我发现这次升级很有趣&#xff0c;因为与以前的版本相比有一些显著的改进。 因此&#xff0c;在本文中&#xff0c;我将讨论Angular 16的前7个特性&#xff0c;以便您更好地理解。…

机器学习基础介绍

百度百科&#xff1a; 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。 …

手工酸奶店如何选址?开在哪里比较合适?

手工酸奶店是一个非常受欢迎的创业项目&#xff0c;但想要成功开店&#xff0c;选址是非常重要的。 本人开酸奶店5年时间&#xff0c;下面我将为大家分享一些选址的小技巧&#xff0c;希望对大家有所帮助。&#xff08;可以点赞收藏&#xff0c;方便以后随时查阅&#xff09; …

入职字节外包一个月,我离职了。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

12.11 C++ 作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

树根研习社|数据为王,洞察“工业数据采集”背后的价值与实践

一、工业数据采集是什么&#xff1f; 数据采集是将各种信息传感设备通过网络结合起来&#xff0c;实现任何时间、任何地点&#xff0c;人、机、物的互联互通。数据采集的主要的作用是&#xff1a; “翻译官”&#xff1a;不同程序语言的设备数据通过协议解析“翻译”为上层系…

淘宝权益玩法平台的Serverless化实践

通过对权益玩法平台现有业务应用的Serverless化改造&#xff0c;权益团队在双十一期间完美地支撑了业务需求&#xff0c;在研发效率、运维保障等方面都体现出了很高的价值和收益。 项目背景 淘宝权益平台是负责淘宝权益营销的核心团队&#xff0c;团队除了负责拉菲权益平台外&a…

1.cloud-微服务架构编码构建

1.微服务cloud整体聚合父工程 1.1 New Project 1.2 Maven选版本 1.3 字符编码 1.4 注解生效激活 主要为lombok中的Data 1.5 java编译版本选8 1.6 File Type过滤 *.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;v…

Nginx配置文件的基本用法

Nginx简介 1.1概述 Nginx是一个高性能的HTTP和反向代理服务器。 是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2Nginx和Apache的优缺点 &#xff…

mybatis数据输出-insert操作时获取自增列的值给对应的属性赋值

jdbc-修改 水果库存系统的 BaseDao 的 executeUpdate 方法支持返回自增列-CSDN博客 1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSE…

王炸升级!PartyRock 10分钟构建 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢&#xff0c;每次都能带来一些最前沿的方向标&#xff0c;这次也不例外。在看完一些 keynote 和介绍之后&#xff0c;我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

基于SSM的健身房预约系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…