查找和二叉树(基础知识和基本操作)

查找:

1.二分查找:先定一个大范围,想一个数,看是在起始范围到中间范围还是中间范围到结束范围,依次循环直到确定值(相当于一直把范围折半,直到找到)

while(low<=high)
{int mid=(low+high)/2if(key==arr[mid])//如果值就是范围的中间值就直接输出else if(key>arr[mid]){low=mid+1;     }else{high=mid-1;    }
}

哈希表:

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

散列函数:

直接定址法:取关键字或关键字的某个线性函数值为哈希地址的方法

数字分析法:通过分析取关键字的若干数位组成哈希地址的方法

平方取中法:取关键字平方后的中间几位数组成哈希地址的方法

除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址的方法

H(key)=key MOD p (p<m)

哈希表表长m: 数组长度除以3/4

p:p一般取不大于表长m的最大质数 

随机数法:使用随机函数random构建哈希函数

哈希冲突

哈希冲突:不同关键字通过哈希函数映射在同一个存储位置

开放定址法:线性探测法、二次探测法、伪随机探测法

再哈希法、链地址法、建立公共溢出区

递归

1.直接递归:函数自己调用自己的方式

2.间接递归:多个函数之间相互调用

3,死递归:类似于死循环

4,递归:递归出口/递归边界 、递归前进段/递归公式

实现阶乘:

int rec(int n)
{if(n==0)return 1;elsereturn n*rec(n-1);
}

实现斐波那契:

int Feiboncii(int n)
{if(n==1||n==2)return 2;elsereturn Feiboncii(n-2)+Feiboncii(n-1);
}

树:

1>树:是由根结点和若干棵子树构成的树形结构

1.是n(n>=0)个结点的有限集,n>0时有且只有一个根结点,除根结点外,其余结点构成的互不相交的集合仍是一棵树

2> 空树:不含任何结点的树n=0

3>根结点:只有一个结点n=1

4> 普通树n>1: 多个结点

4.1有序树:有序树【从上到下,从左到右】是树中每棵子树从左到右排列有一定顺序,不能互换的树

4.2>无序树:无序树是树中每棵子树从左到右排列无顺序,能互换的树

4.3>子树:是树中一个结点以及其下面所有的结点构成的树

树的类型:

1>结点:树中的数据元素

2>结点的度:结点含有子树的个数

3> 根结点:没有双亲结点【前驱】的结点

4>分支结点(内部结点):是度不为0的结点

5>叶结点(终端结点):是度为0的结点

6>结点的层数:是从根结点到某结点所路径上的层数【根结点表示第一层】

7>树的深度(高度):是树中所有结点层数的最大值

8>树的度:各结点度的最大值

结点之间的关系

1>父结点:是指当前结点的直接上级结点

2>孩子结点:是指当前结点的直接下级结点

3>兄弟结点:是由相同父结点的结点

4>祖先结点:是当前结点的直接及间接上级结点

5>子孙结点:是当前结点直接及间接下级结点

6>堂兄弟结点:是父结点在同一层的结点

森林

森林:是指0个或多个互不相交树的集合

二叉树:

二叉树:树的度小于等于2

1>二叉树是每个结点最多有左、右两棵子树且严格区分顺序的树形结构【二叉树不可以互换】

2>二叉树的左边:左子树是以当前结点的左孩子结点作为根节点的子树

3>二叉树的右边:右子树是以当前结点的右孩子结点作为根节点的子树

 特殊形态:

1>空二叉树

2>只有一个根节点

3>只有左子树

4>只有右子树

5>既有左子树又有右子树

二叉树的类型

1>空二叉树:空二叉树是没有结点的二叉树

2>斜树:斜树是所有的结点都只有左子树或者都只有右子树的二叉树

2.1 左斜树:左斜树是所有的结点都只有左子树的斜树

2.2右斜树:右斜树是所有的结点都只有右子树的斜树

3>满二叉树:满二叉树是最后一层是叶子结点,其余结点度是2的二叉树

(1)叶子结点只能出现在最下面一层

(2)非叶子结点的度数一定是2

(3)同样深度的二叉树中,满二叉树的结点的个数最多,叶子结点最多

4>完全二叉树:完全二叉树是在一棵满二叉树基础上自左向右连续增加叶子结点得到的二叉树

(1)只有最后两层有叶子结点

(2)除最后一层是一棵满二叉树

(3)最后一层的叶子结点集中在左边连续的位置

二叉树的性质:

1.在非空二叉树的第i层上,至多有2^(i-1)个结点(i>=1)

2.在深度为K的二叉树上总结点最多有(2^k)-1个结点(k>=1)

3.在任意一棵二叉树中,叶子结点的数目比度数为2的结点的数目多1

4.

5.完全二叉树结点的编号方法是从上到下,从左到右根节点为1号结点设完全二叉树的结点数为n,某结点编号为I

若 i=1,则该结点是二叉树的根,无双亲,否则,其双亲结点是编号为 i/2的结点

若 2*i>n,则该结点无左孩子,否则,其左孩子结点是编号为 2i 的结点

若 2*i+1>n,则该结点无右孩子结点,否则,其右孩子结点是编号为2i+1 的结点

二叉树遍历

先序遍历:按照根左右的顺序

中序遍历:按照左根右的顺序

后序遍历:按照左右根的顺序

先序从前往后确定根,后序从后往前确定根,中序确定根左右的子树

二叉树创建:

Btree create_tree()
{datatypr e;scanf(" %c",&e);if(e=='#')return NULL;Btree tree=(Btree)malloc(sizeof(struct Node));if(tree==NULL)return NULL;tree->data=e;tree->lchild=create_tree();tree->rchild=create_tree();return tree;
}

先序/中序/后序遍历(依据跟的输出语句的位置)

先序(根左右):

void outout(Btree tree)
{if(tree==NULL)return;printf("%c\t",tree->data);//先进来输出节点的值output(tree->lchild);//用递归一直输出左孩子的左孩子,直到NULL,执行下一语句;output(tree->rchild);//接着上一句语句,输出右孩子,如果是NULL,则返回上一节点;
}

中序(左根右):

void outout(Btree tree)
{if(tree==NULL)return;output(tree->lchild);//用递归一直输出左孩子的左孩子,直到NULL,执行下一语句;printf("%c\t",tree->data);//先进来输出节点的值output(tree->rchild);//接着上一句语句,输出右孩子,如果是NULL,则返回上一节点;
}

 后序(左右根)

void outout(Btree tree)
{if(tree==NULL)return;output(tree->lchild);//用递归一直输出左孩子的左孩子,直到NULL,执行下一语句;output(tree->rchild);//接着上一句语句,输出右孩子,如果是NULL,则返回上一节点;printf("%c\t",tree->data);//输出节点的值
}

计算节点个数(0度的节点n0,1度的节点n1,和2度的节点n2)

void Count(Btree tree,int *n0,int *n1,int *n2)
{if(tree==NULL)return;if(tree->lchild==NULL && tree->rchild==NULL)(*n0)++;//没有子树的度为0的节点个数else if(tree->lchild!=NULL && tree->rchild!=NULL)(*n2)++;//有两个子树的度为2的节点个数else(*n1)++;//只有一个子树的度为1的节点个数Count(tree->lchild,n0,n1,n2);Count(tree->rchild,n0,n1,n2);
}

计算树的深度:

int High(Btree tree)
{if(tree==NULL)return 0;int left=High(tree->lchild)+1;//左子树深度int right=High(tree->rchild)+1;//右子树深度return left>right?left:right;//只算最深的子树深度
}

释放二叉树:

void free_space(Btree tree)
{if(tree==NULL)return ;free_space(tree->lchild);free_space(tree->rchild);free(tree);tree=NULL;
}

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

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

相关文章

基于UDP的可靠传输,文件+目录(C++,Qt)

一、基础知识 UDP&#xff08;UserDatagramProtocol&#xff09;是一个简单的面向消息的传输层协议&#xff0c;尽管UDP提供标头和有效负载的完整性验证&#xff08;通过校验和&#xff09;&#xff0c;但它不保证向上层协议提供消息传递&#xff0c;并且UDP层在发送后不会保留…

pandas数据清洗常用方法总结

数据清洗常用方法 一、数据读取与保存二、数据查看三、索引设置与修改四、选择与过滤五、缺失值重复值处理六、异常值处理七、行列增加与删除八、拼接与合并九、统计与排序十、重塑与轴向旋转十一、数据运算十二、数据类型变换十三、分组运算 一、数据读取与保存 pd.read_csv(…

K8S初级入门系列之一-概述

一、前言 K8S经过多年的发展&#xff0c;构建了云原生的基石&#xff0c;成为了云原生时代的统治者。我将用三个博客系列全面&#xff0c;循序渐进的介绍K8S相关知识。 初级入门系列&#xff0c;主要针对K8S初学者&#xff0c;以及希望对K8S有所了解的研发人员&#xff0c;重点…

机器学习术语解析与应用(二)

文章目录 &#x1f340;目标函数&#xff08;Objective Function&#xff09;&#x1f340;GPU加速&#xff08;GPU Acceleration&#xff09;&#x1f340;迁移学习&#xff08;Transfer Learning&#xff09;&#x1f340;自然语言处理&#xff08;Natural Language Processi…

1 快速构建mybatis项目

1.1 使用Maven的quickstart框架 注意是不出现w的quickstart&#xff1a; 1.2 加入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</s…

设计模式之策略模式

定义一系列的算法&#xff0c;把他们一个个封装起来&#xff0c;并且使他们可以相互替代。本模式使得算法可独立于使用它的客户而变化! 痛点 策略模式可以很好解决众多if问题 如以下&#xff1a; package com.tao.YanMoDesignPattern.Strategy.notPattern;/*** Author Mi_Ta…

如何让ChatGPT学习私有化知识,并且保留部分对话功能

问题情境 情景&#xff1a;比如我希望用 GPT 做一个产品的客服&#xff0c;现在有一些相关文档&#xff0c;如何让 GPT 学习到产品信息呢&#xff1f; 并且还具备正常对话功能 一个方案是直接把产品信息当做输入喂给GPT&#xff0c;但是ChatGPT/GPT-4/LLMs 一般都有输入长度的…

安装 PyCharm

网址&#xff1a;Download PyCharm: Python IDE for Professional Developers by JetBrains 安装文件&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 正在安装&#xff1a; 安装完成&#xff1a;

pytest钩子函数(三):用例收集钩子

前言 pytest这个框架提供了非常多的钩子。通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预&#xff0c;根据需求去开发对应的插件&#xff0c;以满足自己的使用场景。 01 什么是钩子函数&#xff1f; 钩子函数在pytest称之为Hook函数,它pytes…

Redis缓存击穿

Redis缓存击穿是指在使用Redis作为缓存时&#xff0c;某个热点数据过期或不存在&#xff0c;导致大量请求直接打到后端存储系统&#xff08;例如数据库&#xff09;&#xff0c;使得后端系统压力骤增&#xff0c;性能下降的情况。这种情况通常发生在热点数据失效的瞬间。 缓存…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

TCP/IP网络编程 第十九章:Windows平台下线程的使用

内核对象 要想掌握Windows平台下的线程&#xff0c;应首先理解“内核对象”&#xff08;Kernel Objects&#xff09;的概念。如果仅介绍Windows平台下的线程使用技巧&#xff0c;则可以省略相对陌生的内核对象相关内容。但这并不能使各位深入理解Windows平台下的线程。 内核对…

RocksDB架构

1、rocksdb是什么? RocksDB中文网 | 一个持久型的key-value存储 rocksdb是一种KV存储引擎&#xff0c;常用于数据库存储数据&#xff0c;无法直接使用&#xff0c;没有提供sql命令&#xff0c;通过调用rocksdb提供的api进行数据库的读写等操作。 rocksdb是以leveldb为基础开…

Linux一些问题,结合gpt,自己复习用

&#xff08;一&#xff09;请介绍linux以及它和windows的区别 &#x1f427; Linux是一个开源的操作系统&#xff0c;它基于UNIX&#xff0c;并具有强大的自由度和灵活性。它被广泛用于服务器环境和嵌入式系统中。Linux有许多不同的发行版&#xff0c;例如Ubuntu、Debian、Fe…

聊聊spring-cloud的负载均衡

聊聊spring-cloud的负载均衡 1. 选择合适的负载均衡算法2. 合理设置超时时间3. 缓存服务实例列表4. 使用断路器5. 使用缓存Spring Cloud负载均衡组件对比RibbonLoadBalancerWebClient对比 总结 在微服务架构中&#xff0c;负载均衡是非常重要的一个环节&#xff0c;可以有效地提…

S32K144 GPIO外设分析

1. S32K144 GPIO外设特性 下面的内容来自于S32K用户手册的翻译&#xff0c;或者网上关于S32K系列的一些pdf文件介绍。有些内容可能会出现理解不到位或者翻译错误方面&#xff0c;如果大家有疑问最好可以查阅用户手册。 GPIO和PORT的数量 从用户手册&#xff0c;对于PCR&#x…

React Dva项目中路由跳转的方法

接下来 我们来看看路由跳转 先打开 我们Dva项目 然后我们需要在routes 下创建一个自己的路由&#xff0c;如果您尚未掌握在Dva项目中创建路由&#xff0c;可以参考我的文章 React 在Dva项目中修改路由配置&#xff0c;并创建一个自己的路由 然后 我的项目有两个路由 router.js…

ASFF Learning Spatial Fusion for Single-Shot Object Detection 论文学习

1. 解决了什么问题&#xff1f; 目标检测取得了显著成绩&#xff0c;但是检测不同尺度的目标仍然是一个挑战。金字塔或多层级特征是解决目标检测中尺度变化的常用手段。但对于单阶段目标检测器而言&#xff0c;各特征尺度之间不一致性制约了算法的表现。与图像金字塔相比&…

VMware Workstation 18 Tech Preview - 增强的 Windows 11 虚拟机安全性

VMware Workstation 18 Tech Preview - 增强的 Windows 11 虚拟机安全性 VMware Workstation Tech Preview 2023 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-workstation-18/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

OpenAI的Function calling 和 LangChain的Search Agent

OpenAI的Function calling openai最近发布的gpt-3.5-turbo-0613 和 gpt-4-0613版本模型增加了function calling的功能&#xff0c;该功能通过定义功能函数&#xff0c;gpt通过分析问题和函数功能描述来决定是否调用函数&#xff0c;并且生成函数对应的入参。函数调用的功能可以…