B树建立与遍历

C C++最全【算法】二叉树的遍历指南(前序、中序、后序、层序,《C C++面试题及解析》分享给大家 二叉树(Binary tree)是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。在下面这副图中,F就是这棵二叉树的根节点,其左、右孩子节点分别为C、E。前序、中序、后序遍历其实都是深度优先思想的体现,我这里采用递归写法,便于记忆,三者的区别在于:遍历左右子树与对此节点做出操作()的顺序对比三种算法,大家可以很清晰地找到他们唯一的不同点:print()函数与两个递归的先后执行顺序。总结以下,可以发现前序遍历。 阅读详情

 

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

# include "btrees.h"

/* 给一个结点分配空间 */
struct btnode * allocateNode(struct btnode *ptr){
    int i,max;
    ptr = (struct btnode *)malloc(sizeof(struct btnode));
    if(!ptr){
        printf("allocated error!\n");
        exit(1);
    }
    max = 2*M;
    for(i=0; i<max; i++)
        ptr->p[i] = NULL;   /* 初始化指针 */
    memset(ptr->k, 0, (max-1)*sizeof(int)); /* 初始化键的值*/
    return ptr;
}


/* 创建一个空的B树,就一个根结点 */
struct btnode * btreeCreate(struct btnode *root){
    root = allocateNode(root);
    root->keyNum = 0;
    root->isleaf = 1;
    return root;
}

/*函数目的:在B树中递归的搜索给定的数据,如果存在则返回数据所在节点和在节点中
 * 的位置,不存在返回NULL
 */
/*
struct searchResult * btreeSearch(struct btree *root, int data){
    int i=0;
    struct searchResult result;
    //找到节点中数据所在位置
    while((i<(2*M-1)) && (data>root->k[i]))
        i++;
    
    //数据找到,返回结果
    if(root->k[i] == data){
        result.ptr = root;
        result.pos = i;
        return result;
    }

    //已经搜索到叶节点,数据不存在,返回NULL
    if(root->isleaf){
        result.ptr = NULL;
        result.pos = -1;
        return result;
    }
    else{   //非叶节点,继续搜索子树节点
        return btreeSearch(root->p[i], data);
    }
}
*/

//函数目的:分裂存储数达到最大的节点
void btreeSplitChild(struct btnode *parent, int pos, struct btnode *child){
    struct btnode *child2;
    int i;
    //为新分裂出的节点分配空间
    child2 = allocateNode(child2);
    //与被分裂点同级
    child2->isleaf = child->isleaf;
    //设置节点数
    child2->keyNum = M-1;

    //复制数据
    for(i=0; i<M-1; i++)
        child2->k[i] = child->k[i+M];
    //如果不是叶节点,复制指针
    if(!child->isleaf)
        for(i=0; i<M; i++)
            child2->p[i] = child->p[i+M];
    child->keyNum = M-1;

    //将中间数作为索引插入到双亲节点中
    //插入点后面的关键字和指针都往后移动一个位置
    for(i=parent->keyNum; i>pos; i--){
        parent->k[i] = parent->k[i-1];
        parent->p[i+1] = parent->p[i];
    }
    parent->k[pos] = child->k[M-1];
    parent->keyNum++;
    parent->p[pos+1] = child2;
}

/* 函数目的:向非满的节点中插入一个数据
 * 注意:插入前保证key在原来的B树中不存在
 */
void btreeInsertNoneFull(struct btnode *ptr, int data){
    int i;
    struct btnode *child;   //要插入结点的子结点
    i = ptr->keyNum;
    //如果是叶节点,直接插入数据
    if(ptr->isleaf){
        while((i>0) && (data<ptr->k[i-1])){
            ptr->k[i] = ptr->k[i-1];
            i--;
        }
        //插入数据
        ptr->k[i] = data;
        ptr->keyNum++;
    }
    else{   //不是叶节点,找到数据应插入的子节点并插入
        while((i>0) && (data<ptr->k[i-1]))
            i--;
        child = ptr->p[i];
        if(child->keyNum == 2*M-1){
            btreeSplitChild(ptr, i, child);
            if(data > ptr->k[i])
                i++;
        }
        child = ptr->p[i];
        btreeInsertNoneFull(child, data);   //在子树中递归
    }
}


/* 插入一个结点 */
struct btnode * btreeInsert(struct btnode *root, int data){
    struct btnode *new;
    /* 检查是否根节点已满,如果已满,分裂并生成新的根节点 */
    if(root->keyNum == 2*M-1){
        new = allocateNode(new);
        new->isleaf = 0;
        new->keyNum = 0;
        new->p[0] = root;
        btreeSplitChild(new, 0, root);
        btreeInsertNoneFull(new, data);
        return new;
    }
    else{    //还没到最大数据数,直接插入
        btreeInsertNoneFull(root, data);
        return root;
    }
}

//函数目的:广度优先显示树
void btreeDisplay(struct btnode *root){
    int i, queueNum=0;
    int j;
    struct btnode *queue[20];
    struct btnode *current;

    //加入队列
    queue[queueNum] = root;
    queueNum++;

    while(queueNum>0){
        //出队
        current = queue[0];
        queueNum--;
        //移出第一个元素后后面的元素往前移动一个位置
        for(i=0; i<queueNum; i++)
            queue[i] = queue[i+1];
        //显示节点
        j = current->keyNum;
        printf("[ ");
        for(i=0; i<j; i++){
            printf("%d ", current->k[i]);
        }
        printf("]  ");

        //子节点入队
        if(current!=NULL && current->isleaf!=1){
            for(i=0; i<=(current->keyNum); i++){
                queue[queueNum] = current->p[i];
                queueNum++;
            }
        }
    }
    printf("\n");
}

int main()
{
    struct btnode *root;
    int a[13] = {18, 31, 12, 10, 15, 48, 45, 47, 50, 52, 23, 30, 20};
    int i;

    root = btreeCreate(root);
    for(i=0; i<13; i++){
        root = btreeInsert(root, a[i]);
        btreeDisplay(root);
    }

    return 0;
}


 

B, B-, B+树的定义,特性,联系与区别(红黑树) B树的不同定义,有时B树即是B-树 为什么会有B树: 因为二叉树的查找平均时间是logN,是与二叉树的深度有关,所以为了减少二叉树的深度,增加查找速度,势必要增加树的叉树。如果该树是M叉的,M&gt;2的话,logm(N)势必要小于log2(N),所以当数据量非常大的时候,B树的平均查找时间要少于二叉树。 红黑树:带有平衡性的二叉搜索树增强版 红黑树是每个节点都带有颜色属性的二叉查找树,颜色... 阅读详情

相关推荐

HAMi 核心模块与架构设计

HAMi 的架构设计是围绕 Kubernetes 生态系统构建的,通过扩展 Kubernetes 的调度能力和设备管理能力,为用户提供了高效、灵活的异构设备虚拟化和管理解决方案。

北斗云的博客 2552

B-Tree以及创建过程演示

当元素<4且>0时,直接按照顺序插入元素即可,插入元素结束,当元素=4时,将插入的元素按照顺序放入结点中,然后从中选择一个数作为当前结点的父结点(选择结点的规则是 (n+1)/2 取整),本例为(5+1)/2=3即选取第三个元素,放入父结点中,若没有父结点则创建一个父结点,则插入结束;首先定义一个5阶的B树(平衡5路查找树),现在我们要把4、9、32、12、24、30、51、29、69、31、90、70、75、79、、80、85、91、 这些数字构建出一个5阶树出来;8.插入70,75,79。

a1_HelloWord的博客 4504

Cocos Creator发布微信小游戏:深度定制与去除默认加载页面的实践指南

本文详细介绍了如何使用Cocos Creator发布微信小游戏时去除默认加载页面的实践方法。通过修改构建配置和重写启动逻辑,开发者可以自定义加载体验,提升品牌一致性。文章还提供了进阶优化方案和常见问题解决方案,帮助开发者实现更专业的微信小游戏发布流程。

weixin_27972919的博客 568

【数据结构】B树的创建

B树也是一种搜索树,二叉搜索树、红黑树、都是动态查找树,典型的二叉搜索结构,查找的时间复杂度和树的高度相关O(log2N)。这些二叉搜索结构有一个共同的缺陷:数据量大,树的高度太高,增大访问磁盘的次数,从而效率低下。想要加速对数据的访问速度: 1.提高I/O的时间 2.降低树的高度——平衡多叉树B树的定义 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:

lz201788的博客 1万+

深度解析:C# Modbus TCP协议解析与异常处理(工控上位机必备)

协议解析要精准:掌握MBAP头和PDU的结构,尤其是常用功能码的请求/响应格式,避免因字节处理错误导致通信失败;异常处理要全面:覆盖通信层、协议层、数据层的所有异常类型,针对工业场景制定重试、重连、滤波等策略;资源管理要规范:使用释放资源,采用连接池复用连接,避免端口泄露;工业场景要适配:结合工控现场的特点(网络波动、电磁干扰、设备忙),优化通信效率和数据处理逻辑。通过以上解析和策略,可确保C#上位机与工业设备的Modbus TCP通信具备高稳定性、高可靠性、高容错性,满足工控领域的严苛要求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 997

养龙虾之_因特尔UHD/ULtra/Arc核显跑大模型_安装ollama_跑qwen3.5:0.8b/9b_使用copaw1.0.1测试_并配置copaw技能效果炸裂---AI大模型应用探索0019

摘要:本文探讨了利用Intel UHD770核显运行大语言模型的可能性。通过使用Intel发布的ipex-llm项目工具包,成功在核显上运行了Qwen3.5系列模型。测试发现0.8B小模型运行流畅(3-5秒响应),但智能程度有限;而9B大模型虽然效果更好,但响应时间长达2分钟,且GPU/CPU占用率不高。实验证明Intel核显确实可以运行LLM,但实际效果和性能表现仍有提升空间,特别是对大模型的支持尚不理想。

添柴程序猿的专栏 236

B树的创建

1.B树的概念一棵M阶的(M>2) 的平衡二叉树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质: 根节点至少有两个孩子; 原因:因为根节点至少有一个关键字,有两个指针域; 每个非根节点至少有M/2-1(上取整)个关键字,至多有M-1个关键字,并且以升序排列; 每个非根节点至少有M/2(上取整)个孩子,至多有M个孩子; key[i]和key[i+1]之间的孩子节点的值介于key[i]、ke

fern_girl的博客 9839

【系统架构设计师】论文:论虚拟现实技术的应用与发展

虚拟现实技术是当前科学研究的热点,同时也是国家大力支持发展的核心技术之一。所谓虚拟现实,就是通过计算机等虚拟手段来构造一个非常接近真实世界的虚拟环境,它主要体现在视觉、触觉、嗅觉等方面的逼真模拟来达到高度的沉浸性,也就是如我们通常所说的“身临其境”。

数据知道的博客 1万+

B树的代码实现

B树的原理在这篇博客https://blog.youkuaiyun.com/xiaoan08133192/article/details/115622370中进行了介绍,这里是B树的代码实现。B树的插入和删除函数,在遍历的时候都是使用不回溯的方法,插入操作在对a结点插入数据的时,已经保证了a的关键字个数小于2*M - 1,删除操作在对a结点删除数据的时,已经保证了a的关键字个数大于M - 1。如何保证这一点是代码的精髓 //M为B树的最小度 #define M 2 typedef struct btree_node

一个小孩 1103

eDP V1.4协议介绍

eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要求;AUX通道电路设计不同(相对DP取消了AC耦合电容和100KΩ/1MΩ的上下拉电阻):典型应用场景;

qflook的博客 4303

基于Simulink的轨道交通信号控制系统仿真详细介绍

轨道交通信号控制系统是确保列车安全、高效运行的核心技术。通过Simulink进行信号控制系统的仿真,可以验证系统的设计、优化调度策略并提高安全性。以下是如何在MATLAB和Simulink中设计并仿真一个轨道交通信号控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的轨道交通信号控制系统仿真。该系统能够根据列车位置、速度和轨道状态生成控制指令,确保列车的安全、高效运行。通过虚拟场景仿真、硬件在环测试和实机测试,验证了系统的性能,并通过参数优化进一步提升了系统的可靠性。引入智能调度。

xiaoheshang_123的博客 462

红黑树 b树 b+树

引言 二叉查找树的查找的时间复杂度是O(log N),B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。 所以,我们为了减少磁盘IO的次数,就你必须降低树的深度,将“瘦高”的树变得“矮胖”。一个基本的想法就是: (1)、每个节点存储多个元素 (2)

xym222的博客 450

得物(毒)App潮鞋价格波动监控系统实战:从爬虫开发到数据可视化完整指南

本文将带领您从零开始构建一套完整的得物潮鞋价格监控系统,涵盖爬虫开发、数据存储、价格波动分析和可视化展示等全流程技术。我们将使用最新的Python技术栈,包括异步爬虫框架、智能代理池、反爬虫绕过技巧,以及基于机器学习的时间序列预测模型。无论您是想要追踪特定鞋款价格的潮流爱好者,还是希望构建商业级监控系统的开发者,这篇文章都将为您提供切实可行的解决方案。

2201_76125261的博客 2506

B1127 ZigZagging on a Tree (树的建立,遍历)

B1127 ZigZagging on a Tree (30分) //简单模板题,思维量不大,手速要快!!! 建树,已知中序,后序 两序建树 判断是否能继续进行 if(left>right) return; 新建根结点,找寻根节点的值和位置 递归左子树和右子树 返回根节点 推层序 层序记录当前结点的深度,vt存放当前层的顺序数 输出 ...

没有期待的日子反而会顺顺利利 490

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构和算法之树形结构B+树(7)

在数据库的操作中,查询操作可以说是最频繁的一种操作,因此在设计数据库时,必须要考虑到查询的效率问题,在很多数据库中,都是用到了B+树来提高查询的效率;B+树中的所有数据均保存在叶子节点,且根结点和内部节点均只是充当控制查找记录的媒介,并不代表数据本身,所有的内部节点关键字都同时存在于子节点中,是子节点关键字中是值最大(或最小)的。当然,也有查找失败的情况,即要查找的元素并不在B+树中。‌的树结构,而今天要讲的B+是B树的一种改进,是B树的一种优化和改进,被大多数据库系统采纳作为索引结构使用。

Liusp的专栏 816

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构之B+树

B+树结构特点 1.非叶子节点仅具有索引作用,也就是说,非叶子节点只能存储Key,不能存储value; 2.树的所有叶节点构成一个有序链表,可以按照key排序的次序依次遍历全部数据。 B+树存储数据 若参数M选择为5,那么每个节点最多包含4个键值对,我们以5阶B+树为例,看看B+树的数据存储。 (1) 在空树当中插入5 (2)继续插入8,10,15 (3)继续插入16 (4)继续插入17 (5)继续插入18 (6)继续插入6,9,1920,21,22 (7)

Beau Wang 1946

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

树(数据结构)(查找)

这里要注意我的编码设计方式,我们将这四个字母以任意顺序,任意长度,用代码传递信息,得到的1和0的数组,翻译成字母后是唯一的。1.哈夫曼树不存在度为1的结点:这个性质我们可以反推,假如哈夫曼树中存在度为 1 的结点,就拿上面的1、3、5、6、8举例,如果存在度为1的结点,那么我们令这颗哈夫曼树的最底层的父节点度为1,那么原本存放1和3的位置,现在只能存放1,而另一个就不能在哈夫曼树的最底层,而要向上存放,但是哈夫曼树本着权值越小越向下层存的特点,这样存放显然违背了哈夫曼树的存放特点,故反推不成立。

French_Riviera的博客 573

算法训练 FBI树

问题描述   我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。   FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:   1)T的根结点为R,其类型与串S的类型相同;   2)若串S的长度大于1,将串S从中间分开,分为等长的左右...

zp1455604302的博客 135

《数据结构》读书笔记

一:算法分析 1:时间复杂度计算 T(n)=函数执行的最大次数。执行次数与输入规模有关。 原则: 1)去除常系数 2)同等数量级并且并列的则用 + 连接,并列的但数量级不同的取大者 3)嵌套的相乘 所以,我们先用 T(n)=K*t(f1(n))+M*t(f2(n))... 计算出算法执行的最大次数,然后运行化简法则化简:去常系数,和式取大,嵌套相乘,即可得到复杂度 ...

a631278993的博客 408

Mysql优化---基于索引优化(B-Tree与B+Tree)

一、索引是什么? 1.MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,即索引的本质是一种数据结构。 可以简单理解为:排好序的快速查找数据结构 详解:在数据之外,数据库系统还维护着满足特定查找算法的数据结构---索引,这些数据结构是以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级的查找算法。 左边是数据表,一共有两列七行数据,最左边存...

sout 663

二叉树、B树(B-树)、B+树、B*树详解,以及为什么MySQL选择B+树做索引

温故而知新,可以为师矣。看到一篇介绍B数和B减树的文章,这里记录一下。 1. 简要 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 2. 二叉树 先介绍一下二叉搜索树。 顾名思义,二叉搜索树,即指最多拥有两个叉,这里的叉即为所有非叶子结点的儿子(Lift和Right); 所有的结点存储一个关键字; 非叶子结点的左指针指向小于其关键字的结点,右指针指向对于其关键字的结点,结构如下图: 二叉搜索树的搜索,从根结点开始,如果查询的关...

zzhongcy的专栏 4431

B+树的Java实现(B+ Tree)

B+树 B+ Tree 定义 B+树是一种多路平衡查找树,是对B树(B-Tree)的扩展. 首先,一个M阶的B树的定义为: 每个节点最多有M个子节点; 每一个非叶子节点(除根节点)至少有ceil(M/2)个子节点; 如果根节点不是叶子节点,那么至少有两个子节点; 有k个子节点的非叶子节点拥有k-1个键,键按照升序排列; 所有叶子节点在同一层; 从定义可以看出来,一个M阶的B树,其叶子节点必须在...

桐小目的秘密基地 2万+

mysql为什么不用b树_MySQL用B+树(而不是B树)做索引的原因

众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢?先看一下B树和B+树的区别。1.B树维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化...

weixin_29563497的博客 4540

建立B树图(查询,创建)

我们先插入g,是空树,购买一个结点,g插入到data的1号位置。我们插入k,要先进行查询,树中有没有这个k,所以查询就是首先把k放到哨兵位(d[0]),进行查询,拿k和g比较,k>g,在1号位置之后插入,也就是插入到2号位置。当前,我们的个数是2,最大个数不能超过4。现在是OK的。我们接着插入数据m,首先把m放到哨兵位,因为当前个数是2,所以从2下标开始比较,m大于k,我们把m放在3号位置。

ljy的博客 1047

MySQL索引、B+树相关知识总结

在 B+树中,非叶子节点不存储数据,只存储键值,这意味着非叶子节点可以拥有更多的键,从而有更多的分叉。 这导致树的高度更低,进一步降低了查询时磁盘 I/O 的次数,因为每一次从一个节点到另一个节点的跳转都可能涉及到磁盘 I/O 操作。

python全栈 3907

基于树的查找法 树表式查找法

(1) 定义:二叉排序树或者是一棵空树, 或者是具有如下性质的二叉树。 ① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值。 ② 若它的右子树非空, 则右子树上所有结点的值均大于根结点的值。 ③ 它的左右子树也分别为二叉排序树。 二叉排序树的特性:中序遍历的结果为一个递增的有序序列。逆中序遍历的结果为一个递减的有序序列。 (2) 存储结构描述 二叉排序树的插入与创建 (1) 二叉排序树的插入 插入关键字key的算法思想: 若二叉排序树是空树,则key成为二叉排序树的根。 否则,则将key与二叉

学习日常分享 587
上一篇: 二叉树的建立与遍历
下一篇: 使用指针做函数返回值
unix21
博客等级 码龄14年 115粉丝 248原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值