二叉树的存储

news2025/1/10 23:44:29

二叉树的存储

满二叉树或者完全二叉树可以采用顺序存储,普通二叉树一般采用链式存储

节点的结构体原型

typedef int DataType

typedef struct node

{

DataType data;

struct node *L;

struct node *R;

}twotree,*twotreePtr;

二叉树的相关操作(功能函数的封装)

创建

函数返回类型:二叉树指针

参数列表:无

判断申请空间是否合法

先序遍历

先打印数据,再打印左节点的数据,最后再打印右节点的数据

参数列表:二叉树指针

判断申请空间是否合法

中序遍历
先打印左节点的数据,再打印数据,最后再打印右节点的数据

后序遍历

先打印左节点的数据,再打印右节点的数据,最后再打印数据

已知先序遍历和中序遍历的结果,反推二叉树

已知后序遍历和中序遍历的结果,反推二叉树

算法

概念

计算机解决问题的方法

特性

确定性:算法每一个语句具有确定的意思

有穷性:在执行一定时间后,自动结束算法

输入:至少有0个或多个输入

输出:至少有一个或多个输出

可行性:经济可行,社会可行

算法设计要求

正确性:对于正确的输入,会给出正确的结果,尽可能少的出现Bug

健壮性:对于错误的输入,要给出合理的处理

可读性:要求代码要有注释、有缩进、命名要规范

高效率:要求时间复杂度尽可能低

低存储:空间复杂度尽可能低

算法时间复杂度(T(n))

算法时间复杂度计算公式:T(n) = O(f(n));

T(n):时间复杂度

n:表示问题的规模

f(n) :是问题规模与执行次数之间的函数

O(f(n)):使用O阶记法,记录算法时间复杂度

时间复杂度推导

常见的时间复杂度

排序算法

概念

定义:将给定的序列,按照关键字进行升序或降序排列的过程叫做排序

分类:

交换类排序:冒泡排序、快速排序

选择类排序:简单选择排序,堆排序

插入类排序:直接插入排序、折半插入排序、希尔排序

归并排序:二路归并、三路归并。。。

基数排序

快速排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义一个基准
int get(int *p,int l,int r)
{
    int q=p[l];
    while(l<r)
    {
        while(p[r]>q&&l<r)
        {
            r--;
        }
        p[l]=p[r];            //将小的数据放左边
        while(p[l]<q&&l<r)
        {
            l++;
        }
        p[r]=p[l];           //将大的数据放右边
    }
    p[l]=q;                                                                              
    return l;
}

//实现快速排序
void quick(int *p,int l,int r)
{
    if(l<r)
    {
        int q=get(p,l,r);
        quick(p,l,q-1);
        quick(p,q+1,r);
    }
}
void show(int *p,int len)
{

    for(int i=0;i<len;i++)
    {
        printf("%d ",p[i]);
    }
    putchar(10);
}

int main(int argc, const char *argv[])
{
    int arr[]={2,1,5,4,3,9,8};
    int len=sizeof(arr)/sizeof(arr[0]);

    //快速排序
    quick(arr,0,len-1);

    show(arr,len);
    return 0;
}

直接插入排序

查找算法

概念

按照关键字,在查找表中查询是否存在的算法叫做查找

分类

顺序查找:将给定的查找表进行全部遍历一遍,与要查找的关键字进行比对。

折半查找(二分查找):在顺序存储的有序序列中,通过进行逐次减半查找范围,查找特定的关键字的算法,叫做折半查找。

哈希查找:通过哈希函数,在哈希表中定位要找的数据元素

折半查找

要求:查找表是顺序存储,并且有序序列

原理:通过不断减半查找范围,最后确定查找的值

算法:

哈希查找

哈希表是借助哈希函数将序列存储于连续存储空间的查找表

哈希函数是根据关键字确定存储位置的函数

哈希函数的构造方式:直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法

哈希冲突是不同关键字由哈希函数得到相同存储位置的现象

解决哈希冲突的方法:

1、开放定址法

线性探测法

二次探测法

伪随机探测法

2、再哈希法

3、链地址法 (顺序表和链表的集合)

4、建立公共溢出区

哈希表的长度确定方法:数据元素个数除以四分之三得到的最大素数

哈希查找的完整实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//哈希长度=存放元素的个数*4/3
#define N 13     //存放了10个元素,哈希长度为13

//定义一个哈希表的结构体原型
typedef struct node
{
    int data;
    struct node *next;
}hash,*hashPtr;

//哈希表的存储
void add(hashPtr h[],int data)
{
    int idex=data%N;

    //申请空间,封装数据
    hashPtr p=(hashPtr)malloc(sizeof(hash));
    if(NULL==p)                                                                                                                                
    {
        printf("申请失败\n");
        return;
    }
    p->data=data;
    p->next=NULL;

    p->next=h[idex];
    h[idex]=p;

}

//打印哈希表
void show(hashPtr h[],int len)
{
    for(int i=0;i<len;i++)
    {
        printf("%d ",i);

        hashPtr p=h[i];
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("NULL\n");
    }
}

//哈希查找
void find(hashPtr h[],int len,int data)
{
    int idex=data%N;

    hashPtr p=h[idex];
    while(p)
    {
        if(p->data==data)
        {
            printf("FIND,%d\n",idex);
            return;
        }
        printf("NO FIND\n");
    }

}

int main(int argc, const char *argv[])
{
    int arr[]={12,45,35,48,67,15,46,18,94,64};
    int len=sizeof(arr)/sizeof(arr[0]);

    //定义一个哈希表
    hashPtr h[N];

    //初始化哈希表
    for(int i=0;i<len;i++)
    {
        h[i]=NULL;
    }

    //将数据存入哈希表
    for(int i=0;i<len;i++)
    {
        add(h,arr[i]);
    }

    show(h,len);

    find(h,len,18);
    return 0;
}

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

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

相关文章

【数值计算方法】数值积分微分-python实现-p3

原文链接&#xff1a;https://www.cnblogs.com/aksoam/p/18332123 更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xf…

【阅读笔记】红外sensor的ITR、IWR读出模式分析

一、ITR、IWR读出模式分析 InGaAs短波红外探测器具有ITR和IWR两种工作模式。两种工作模式都包括三个相同的工作过程&#xff0c;即复位、积分和读出。每个工作过程的开始与结束都由配置指令码控制&#xff0c;配置指令码包括复位指令、开始积分指令、开始读出指令和读出结束指…

找到学习的引擎,更让你进入心流状态的高效学习

一、心流状态的启动秘籍 1. 简单开始&#xff1a;找到学习的入口 从简单的任务开始&#xff0c;比如整理学习空间或列出学习计划&#xff0c;让大脑逐渐适应学习的节奏。 2. 环境塑造&#xff1a;打造专注的学习空间 清理桌面&#xff0c;减少干扰&#xff0c;比如将手机置…

探索未来之境:揭秘元宇宙(Metaverse)

在科技与想象的交界&#xff0c;一个名为“元宇宙”&#xff08;Metaverse&#xff09;的概念正逐渐从科幻走入现实&#xff0c;预示着人类交互与体验的全新纪元。元宇宙不仅是技术的飞跃&#xff0c;更是未来生活方式的蓝图&#xff0c;它模糊了虚拟与现实的界限&#xff0c;开…

Ubuntu配置项目环境

目录 一、Xshell连接云服务器 二、切换到root用户 三、安装jdk 四、安装tomcat 五、安装mysql 1、安装mysql服务器 2、卸载mysql服务器 六、正式进行程序的部署 一、Xshell连接云服务器 要想使用xshell连接上云服务器就需要明确云服务器的几个信息&#xff1a; 1&…

Qt 的径向渐变的类QRadialGradient 学习笔记

QRadialGradient 是 PySide&#xff08;即 Qt 的 Python 绑定&#xff09;中用于创建径向渐变的类。径向渐变是一种从中心点向外扩展的渐变效果&#xff0c;与线性渐变不同&#xff0c;线性渐变是沿着一条直线变化的。基本概念 QRadialGradient 可以用来为图形项、形状或背景…

python调用IP摄像头

一、手机端下载软件 至于怎么下载&#xff1f;&#xff1f; 直接去浏览器搜索&#xff0c;并找到对应的下面的这个即可&#xff0c;也可以用我提供的这个链接去下载 IP Camera摄像头app下载-IP Camera无线摄像头app下载 v28.7.3手机客户端 - 多多软件站 二、勾选RTSP服务器&…

【Web 前端开发】vue3开发环境部署

1、安装 Node.js 和 npm 访问 Node.js 官网 下载并安装最新的 LTS 版本。 安装完成后&#xff0c;打开命令行工具&#xff0c; 输入 node -v 和 npm -v 检查安装是否成功。 node -vnpm -v 如下图&#xff1a; 2、安装 Vue CLI 在命令行工具中输入以下命令安装 Vue CLI&…

【刷题汇总 -- 游游的重组偶数、体操队形、二叉树中的最大路径和】

C日常刷题积累 今日刷题汇总 - day0281、游游的重组偶数1.1、题目1.2、思路1.3、程序实现 2、体操队形2.1、题目2.2、思路2.3、程序实现 -- 递归(dfs) 剪枝 3、二叉树中的最大路径和3.1、题目3.2、思路3.3、程序实现 -- 递归树形dp 4、题目链接 今日刷题汇总 - day028 1、游游…

快递进小区太难了!大量快递到底放在哪里?

如今&#xff0c;快递小哥是市民生活中不可或缺的角色&#xff0c;但他们在服务城市、满足市民需求的同时&#xff0c;也会遇到一些不被居民理解的情况。 “为什么不让进小区” “一些高档小区管得严&#xff0c;不让我们快递员进小区送货&#xff0c;但是这个标注是送货上楼的…

Netty 必知必会(四)—— Channel-Pipeline 责任链

一、责任链模式 适用场景: 对于一个请求来说&#xff0c;如果每个对象都有机会处理它&#xff0c;而且不明确到底是哪个对象会处理请求时&#xff0c;我们可以考虑使用责任链模式实现它&#xff0c;让请求从链的头部往后移动&#xff0c;直到链上的一个节点成功处理了它为止 …

openeuler的mariadb数据库安装

下载数据库 yum install mariadb-server 如果出现文件冲突如下删除即可 yum remove selinux-policy-targeted --nobest --nobest 无视需求关系 systemctl enable --now mariadb.service #自启动 mysql_secure_installation 初始化Mysql根据自己需求填y|n 第一次进…

运动耳机界的“冠军之选”!奥运会冠军同款耳机曝光!

近期&#xff0c;相信大家的目光都被奥运会所吸引&#xff0c;作为一个有着多年使用蓝牙耳机经验的专业测评师&#xff0c;在此告诉大家&#xff0c;其实有很多奥运会选手在训练的时候会戴耳机&#xff0c;因为这样不仅可以缓解训练中的疲惫&#xff0c;而且可以增加训练的激情…

Docker Compose方式部署Ruoyi-前后端分离版本

目录 一. 环境准备 二. 制作一个jdk8u202环境的镜像 三. 制作nginx镜像 四. 对项目文件做修改 五. 项目打包 1. 前端打包 2. 后端打包 六. 编写docker-compose.yml 一. 环境准备 主机名IP系统软件版本配置信息localhost192.168.226.25Rocky_linux9.4 git version 2.4…

InfluxDB的安装与使用

目录 1.influxDB的下载地址&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb-1.8.3_windows_amd64.zip 2.在D盘创建一个influxDB的文件夹 3. 在安装目录输入cmd,执行influxd.exe 4.启动成功 5.下载nssm安装相关服务&#xff0c;下载地址https://nssm.cc/…

Xinstall全渠道统计服务,轻松掌握App用户全生命周期数据

在当今数字化时代&#xff0c;App的推广和运营显得尤为重要。然而&#xff0c;面对复杂多变的推广渠道和用户行为&#xff0c;如何精准地评估渠道效果、提升获客能力&#xff0c;成为了众多App运营者面临的难题。此时&#xff0c;Xinstall作为一站式App全渠道统计服务商&#x…

大麦网抢票攻略:使用Python Selenium实现

随着互联网技术的发展&#xff0c;在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而&#xff0c;面对热门活动&#xff0c;门票往往在开售瞬间被抢购一空。为了解决这一问题&#xff0c;本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…

Linux线程1

守护进程 1.守护进程的特点 后台服务进程 独立于控制终端 周期性执行某任务 不受用户登录注销影响 一般采用以d结尾的名字&#xff08;服务&#xff09; 2 . 进 程 组 进程的组长 组里边的第 一 进程 进 程 组 的ID 进 程 中 的 组 长 的ID 进 程 中 组 长 的 选 择 …

SQL注入——搜索型注入

搜索型注入——原理介绍 一些网站为了方便用户查找网站的资源&#xff0c;都对用户提供了搜索的功能&#xff0c;因为是搜索功能&#xff0c;往往是程序员在编写代码时都忽略了对其变量(参数)的过滤&#xff0c;而且这样的漏洞在国内的系统中普遍的存在; 其中又分为 POST/GET…