数据结构(八)二叉树、哈希查找

文章目录

  • 一、树
    • (一)概念
      • 1. 前序遍历:根左右
      • 2. 中序遍历:左根右
      • 3. 后序遍历:左右根
      • 4. 层序遍历:需要借助队列实现
    • (二)代码实现:二叉树
      • 1. 结构体定义
      • 2. 创建二叉树
        • 1. 注意点
        • 2. 代码实现
      • 3. 遍历二叉树
        • 1. 注意点
        • 2. 代码实现
      • 4. 销毁树
        • 1. 注意点
        • 2. 代码实现
  • 二、哈希Hash
    • (一)构造函数:保留除数法(质数除余法)
    • (二)处理冲突的方法
      • 1. 开放地址法
      • 2. 链地址法
    • (三)使用实例
      • 1. 功能需求
      • 2. 需求分析
      • 3. 代码实现
        • (1)结构体定义
        • (2)

一、树

(一)概念

1. 前序遍历:根左右

先遍历根节点 然后遍历左子树 最后遍历右子树
一般用于创建一棵树时,因为得先有根节点,才能给根节点左右指针分配空间

2. 中序遍历:左根右

先遍历左子树 然后遍历根节点 最后遍历右子树
对于一颗有序的二叉树,使用中序遍历,可以得到一个有序的数列

3. 后序遍历:左右根

先遍历左子树 然后遍历右子树 最后遍历根节点
一般用于销毁一棵树时,因为需要先释放左右子树,才能释放根节点

4. 层序遍历:需要借助队列实现

根节点入队列,然后出队列前,先把要出的节点的左右子树

(二)代码实现:二叉树

1. 结构体定义

typedef struct _Node{char data; //数据域struct _Node *lchild; //左子树struct _Node *rchild; //右子树
}node_t;

2. 创建二叉树

1. 注意点
  1. 创建二叉树是按照前序的顺序来创建的
  2. 判断递归是否结束的语句,需要放在申请空间之前,否则如果申请空间后再执行递归结束,会造成内存泄漏
2. 代码实现
int create_tree(node_t **root){if(NULL==root) return -1;char data;printf("请输入节点数据:");scanf("%c",&data);getchar();//吃垃圾字符if('#'==data) return 0; //递归的出口*root=(node_t *)malloc(sizeof(node_t));if(NULL==*root) return -1;(*root)->lchild=NULL;(*root)->rchild=NULL;(*root)->data=data;//左子树create_tree(&((*root)->lchild));//右子树create_tree(&((*root)->rchild));return 0;
}

3. 遍历二叉树

1. 注意点
  1. 遍历二叉树,前序、中序、后序的区别仅在于调用函数的顺序,前序即先打印根节点,再打印左节点,最后打印右节点;中序则先打印左节点,再打印根节点,最后打印右节点;后序就是先打印左节点,再打印右节点,最后打印根节点
2. 代码实现
//前序遍历
int preorder(node_t *root){if(NULL == root) return -1;printf("%c ",root->data);preorder(root->lchild);preorder(root->rchild);return 0;
}//中序遍历
int inorder(node_t *root){if(NULL == root) return -1;inorder(root->lchild);printf("%c ",root->data);inorder(root->rchild);return 0;
}//后序遍历
int postorder(node_t *root){if(NULL == root) return -1;postorder(root->lchild);postorder(root->rchild);printf("%c ",root->data);return 0;
}

4. 销毁树

1. 注意点
  1. 销毁树要按照后续顺序销毁,即先销毁左右节点,最后再释放根节点
2. 代码实现
int destory_tree(node_t **root){if(NULL == root|| NULL==*root) return -1;//先销毁左右子树destory_tree(&((*root)->lchild));destory_tree(&((*root)->lchild));//销毁根节点free(*root);*root=NULL;return 0;
}

二、哈希Hash

理想的哈希查找方法:对于给定的key值不需任何比较就可以获取记录。
在建立记录表时,确定记录的key与其存储地址的关系,这个关系就是Hash函数,H(key)
下述仅介绍一种常用的方法

(一)构造函数:保留除数法(质数除余法)

基本思想:设一个Hash表空间长度为m,取一个不大于m的最大的质数p
公式表达:H(key)=key%p

(二)处理冲突的方法

冲突:表中某地址中已存放数据,但是另一个数据经过Hash函数后得到的地址与该地址相同
选取随机度好的Hash函数可以使冲突减少,但是很难完全避免

在处理冲突的过程中,可能发生一连串的冲突现象,即可能得到一个地址序列H1、H2……Hn,Hi∈[0,m-l]。
H1是冲突时选取的下一地址,而H1中可能己有记录,又设法得到下一地址H2……直到某个Hn不发生冲突为止。这种现象称为“聚积”,它严重影响了Hash表的查找效率

1. 开放地址法

在这里插入图片描述
如下图,46%13=7,07%13=7,但是地址8已有数据,使用线性探查法,将07存到了地址9
在这里插入图片描述
但是这种方法可能会因为处理冲突占用空间而导致冲突产生,例如,如果此时再存入数据09,09%13=9,09本应该存在地址9,但是为了解决46和07的冲突,占用了地址9的位置,而导致冲突产生。还有可能发生聚积。

此外,在遍历数据查找有无某元素时,无法确定需要遍历多少地址增量才能确定没有该元素.

2. 链地址法

发生冲突时,将各冲突记录链在一起
这种方法不会发生聚积现象,且容易判断某元素是否存在
在这里插入图片描述

(三)使用实例

1. 功能需求

运用哈希思想实现学生信息录入和查找
存储学生信息,以名字首字母为关键字设计哈希函数,用链地址法解决哈希冲突

2. 需求分析

  1. 需要定义一个学生节点的结构体

3. 代码实现

(1)结构体定义

(2)

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

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

相关文章

LED显示屏模组七大参数

LED模组是LED显示屏的核心组件,它包含LED线路板和外壳,将LED灯珠按照特定规则排列并封装,通常还会进行防水处理。随着LED显示屏行业的发展及其广泛应用,LED模组的功能和作用变得愈加重要。那么,LED模组的七大参数是什么…

深度学习创新点不大但有效果,可以发论文吗?

深度学习中创新点比较小,但有效果,可以发论文吗?当然可以发,但如果想让编辑和审稿人眼前一亮,投中更高区位的论文,写作永远都是重要的。 那么怎样“讲故事”才能让论文更有吸引力?我总结了三点…

【Python】解决Python报错:TypeError: ‘int‘ object is not iterable

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

一款开箱即用的Markdown 编辑器!【送源码】

开源的 Markdown 编辑器 Cherry Markdown Editor 是一款前端-markdown-编辑器-组件,具有开箱即用、轻量简洁、易于扩展等特点,它可以运行在浏览器或服务端 (NodeJs). 当 Cherry Markdown 编辑器支持的语法不满足开发者需求时,可以快速的进行…

【Python】解决Python报错:TypeError: ‘xxx‘ object is not subscriptable

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

软件无线电学习-发射机体系结构

本文知识内容摘自《软件无线电原理和应用》 软件无线电主要由发射机和接收机两大部分组成。软件无线电发射机的主要功能是把需发射或传输的用户信息(话音、数据或图像)经基带处理(完成诸如FM、AM、FSK、PSK、MSK、QAM 等调制)和上变频,调制到规定的载频(中心频率)上…

Gir clone 设置代理与错误

git查看、配置、删除代理 link git config --global https.proxy http://127.0.0.1:1080 git config --global http.proxyhttps://stackoverflow.com/questions/11265463/reset-git-proxy-to-default-configuration git config --global --unset http.proxy git config --gl…

SpringMVC 数据映射VC

从 view 层发送请求到Controller,在Controller中获取参数: 在不输入值时会报400,参数错误 在不输入值时num默认为null 没有找到对应标签名称叫nums的,输入任何值时都报400 设置required默认值为false,即使表单没有nums…

基于Centos7 安装k8s一主两从

一、资源准备 mac下虚拟机环境搭建 1、使用搜狐的iso源 http://mirrors.sohu.com/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso 下载 iso镜像。 2、https://www.macwk.com/soft/vmware 下载 mac vm虚拟机 3、搭建一主两从集群所需虚拟机 4、新建虚拟机…

php反序列化初步了解

一、定义 序列化(串行化):将变量转换为可保存或传输的字符串的过程(通常是字节流、JSON、XML格式) 反序列比(反串行化):把这个字符串再转化成原始数据结构或对象(原来的…

长安链使用Golang编写智能合约教程(一)

长安链是分2.1.和2.3.两个版本,本节面说的是2.1.的版本 需要2.3.版本的合约,请看教程(二)! 教程(二)我会写如何查历史数据 教程二:(长安链2.3.的版本的智能合约编写&…

在WHM中如何调整max_post_size参数大小

今日我们在搭建新网站时需要调整一下PHP参数max_post_size 的大小,我们公司使用的Hostease的美国独立服务器产品默认5个IP地址,也购买了cPanel面板,因此联系Hostease的技术支持,寻求帮助了解到如何在WHM中调整PHP参数,…

反转!Greenplum 还在,快去 Fork 源码

↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ 今早被一条消息刷爆群聊,看到知名开源数仓 Greenplum 的源码仓“删库跑路”了。 要知道 GP 新东家 Broadcom 前几日才刚刚免费开放了 VMware Workstation PRO 17 和 VMware Fusion P…

linux系统的逻辑卷管理及磁盘配额

目录 逻辑卷管理 磁盘配额 逻辑卷管理 lvm:logical volume manager 逻辑卷管理 linux系统下对硬盘分区的一种管理机制。 lvm机制特别适合于管理大存储设备,可以动态的对硬盘进行扩容。 逻辑上的磁盘,概念上的磁盘&a…

QTP——功能测试

一、前言(课设目的及内容) QTP是quicktest Professional的简称,是一种自动测试工具。使用QTP的目的是想用它来执行重复的手动测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试&…

五个超级好用的Prompt网站,让你的GPT效率碾压旁人!

五个超级好用的Prompt网站,让你的GPT效率碾压旁人! 1. 150 Best ChatGPT Prompts for All Kinds of Workflow 该网站包含了150个能够显著提升工作流程效率的ChatGPT Prompt。从制作引人入胜的内容到简化项目,这些提示应该有助于将 ChatGPT …

【Python】解决Python报错:IndentationError: expected an indented block

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

基于51单片机的酒精浓度检测仪的设计

一.硬件方案 硬件部分为利用MQ3气敏传感器测量空气中酒精浓度,并转换为电压信号,经A/D转换器转换成数字信号后传给单片机系统,由单片机及其相应外围电路进行信号的处理,显示酒精浓度值以及超阈值声光报警。电路主要由51单片机最小…

【刷题(13)】二分查找

一、二分查找基础 &#xff08;1&#xff09;int mid ((right - left) >> 1) left; &#xff08;2&#xff09;lower_bound的底层实现 int lower_bound(vector<int>& nums, int x) {int left 0;int right nums.size() - 1;// 区间为 左闭右闭while (lef…

基于python实现生命游戏

文章目录 一、生命游戏是什么二、生命游戏规则解释1.相邻细胞2.细胞状态 三、代码实现1.邻居细胞2.更新状态 四、整体代码 一、生命游戏是什么 生命游戏&#xff08;Game of Life&#xff09;是由英国数学家约翰何顿康威在1970年发明的一种细胞自动机&#xff08;Cellular Aut…