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

news2024/10/7 10:21:40

查找:

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

while(low<=high)
{
    int mid=(low+high)/2
    
    if(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;
    else
        return n*rec(n-1);
}

实现斐波那契:

int Feiboncii(int n)
{
    if(n==1||n==2)
        return 2;
    else
        return 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.coloradmin.cn/o/782676.html

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

相关文章

一元多项式的表示及相加

实现思路&#xff1a; 通过链表实现&#xff0c;会更为简单直观。用链表中的每个结点表示多项式中的每一项&#xff0c;多项式每一项都是由数据域&#xff08;包含系数和指数&#xff09;和指针域构成的&#xff0c;所以在定义表示结点的结构体时&#xff0c;可如下所示进行定义…

【Ansible 自动化配置管理实践】01、Ansible 快速入门

目录 一、Ansible 快速入门 1.1 什么是 Ansible ​1.2 Ansible 主要功能 1.3 Ansible 的特点 1.4 Ansible 基础架构 二、Ansible 安装与配置 2.1 Ansible 安装 2.2 确认安装 三、Ansible 配置解读 3.1 Ansible 配置路径 3.2 Ansible 主配置文件 3.3 Ansi…

PHP后台登录功能单账号登录限制

PHP后台登录功能单账号登录限制 单账号登陆是什么第一步创建数据表第二步创建登录页面test2.html第三步创建登录提交test2.php第四步访问后台首页第五步演示 单账号登陆是什么 一个用户只能登录一个账号通常被称为单账号登录限制或单用户单账号限制。这意味着每个用户只能使用…

TCP通信 -- 接收并反馈(全)

TCP通信整体过程&#xff1a; 1.【服务端】启动,创建ServerSocket对象&#xff0c;等待连接。2.【客户端】启动,创建Socket对象&#xff0c;请求连接。3.【服务端】接收连接,调用accept方法&#xff0c;并返回一个Socket对象。4.【客户端】Socket对象&#xff0c;获取OutputStr…

JVM之内存与垃圾回收篇3

文章目录 8 垃圾回收8.1 基本理论8.1.1 对象的finalization机制8.1.2 理解System.gc8.1.3 内存溢出和内存泄漏8.1.4 Stop The World8.1.5 安全点和安全区域8.1.6 Java中的引用 8.2 垃圾回收算法8.2.1 引用计数法8.2.2 可达性分析8.2.2.1 使用MAT查看GC Roots8.2.2.2 使用JProfi…

【docker,typeorm】docker时区与本地时区的不同步【已解决】

前言 我使用账号登陆vuecms.cn网站&#xff0c;查看登陆日志&#xff0c;发现所有时间全部少8个小时。懵逼树上懵逼果&#xff0c;懵逼树下你和我… 我的开源网站后端是基于nestjs&#xff0c;数据库使用typeorm进行连接操作 原因分析&#xff1a; 原因一: docker环境与本地环…

结构型设计模式之适配器模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

Type [unknown] not present(主要问题是jar冲突)

解决方案&#xff1a;1选择pom.xml 2鼠标移动到打开的pom.xml点击右键选择maven 显示图 3ctrl鼠标左键移动找到红线 可以看到引入冲突 4按照实际需求对pom.xml的引入进行增删或者版本升级降级&#xff0c;直到以下图标中没有红线冲突即可

SQL注入 三范式

学习目标 了解三范式的要求 1. 什么是范式 设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数据库&#xff0c;这些不同的规范要求被称为不同的范式&#xff0c;各种范式呈递次规范&#xff0c;越高的范式数据库冗余越小。 实际上家用电器都有…

香农极限是如何影响光纤容量的

1 引言 上世纪末&#xff0c;DWDM技术开始在干线通信中使用并迅速普及。虽然当时DWDM系统的容量只有402.5G&#xff0c;但实验室中DWDM支持的波道数甚至超过了1000波&#xff0c;单波道速率也飙到了惊人的160G&#xff08;超1000波和单波160G是两个独立事件&#xff09;。人们普…

docker快速搭建并使用Zabbix

docker搭建并使用Zabbix 0 zabbix基础知识 zabbix-server zabbix 的server 端&#xff0c;负责接收agent发送过来的监控数据&#xff0c;并且提供zabbix的所有核心功能。database 用于存储监控数据和配置信息的数据库&#xff0c;目前常用的有mysql和postgresql两种数据库。za…

【AutoSAR应用软件设计】

AutoSAR总体架构 是本文讲解内容。 接口类型 AUTOSAR接口 –SWCs和/或BSW模块交换的信息–独立于实施/网络/硬件–端口接口 标准化AUTOSAR接口 –AUTOSAR接口–标准化的语法和语义–标准化端口接口 标准化接口 –标准化API–通常为特定编程语言&#xff08;“C”&#x…

火狐浏览器鼠标点击页面区域文字时,出现光标的问题

点击一些资源卡片和查看别的页面时&#xff0c;发现点击非输入框的地方&#xff0c;出现了光标&#xff0c;误以为光标处可以填写东西&#xff0c;就试着敲了几次键盘&#xff0c;发现没有任何反应&#xff1b;然后就叫开发那个页面的同事过去看看&#xff1b;那个同事按F12各种…

如何监控Linux和Oracle数据库运行状态

背景: 在生产环境中,一般可能会发生服务器宕机或者数据库宕机的情况,如何准确的把握找准”生产事故“的具体发生时间,其实有很多方法,可以借助第三方的监控软件或者其他收费软件。 但是本人就是穷逼一个,不可能买或者使用盗版的三方软件。所有设计了以下流程检测Linux和…

16_LinuxINPUT子系统

目录 input子系统简 input驱动编写流程 注册input_dev 上报输入事件 input_event结构体 按键input驱动程序编写 编写测试APP 运行测试 input子系统简 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。…

node中间件-express框架

文章目录 前置 Express安装1. 基本使用2. 中间件2.1 中间件应用 3. 中间件的注册方式3.1 普通中间件的注册3.2 path匹配中间件3.3 method与路径匹配3.4 案列中间件匹配与执行方法 4. 中间件request数据解析4.1 解析request body中间件4.2 urlencoded解析 5. 第三方中间件5.1 mo…

CHI协议保序之Comp保序

一致性系统中&#xff0c;需要 memroy model 使用 multi-copy atomicity; 一致性系统中&#xff0c;使用三种保序方式&#xff1b; Completion response □ Comp 响应 表示当前的请求&#xff0c;己经达到了 POC/POS, POC/POS 将保证其命令的执行顺序和接收的顺序是一致的&…

Python(三十三)分支结构——嵌套if的使用

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Android Studio下载

目录 确定版本下载地址 确定版本 如果是入职工作&#xff0c;先和同事确定好版本。因为每个项目使用的gradle插件版本&#xff0c;是在根目录的build.gralde文件中统一定义的&#xff0c;这个文件在添加第三方库&#xff08;例如GreenDao&#xff0c;Arouter等&#xff09;或者…

SpringBoot项目的创建

等待maven下载完成 删除无用文件 此时我们就创建成功了