二叉搜索树

grafana对接zabbix数据展示 【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。 阅读详情
概述:

二叉搜索树中的关键词总是以满足二叉搜索树性质的方式来存储:
设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。

Notes:不同于一般二叉树,二叉搜索树的顺序与结点内容即key值有关,而一般二叉树对相应结点的key值没有要求,故若要对一般二叉树进行遍历,则要排序,因此才有常见的先序,中序,后序三种遍历方式

这样一棵树可以使用一个链表数据结构来表示。
对二叉搜索树的基本操作有:
查找(基于关键词、最小值、最大值、后继、前驱)、插入(考虑空树情况)、删除
(时间复杂度均为O(h), h为树的高度)

代码实现
#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

typedef struct BiTree{//也即三叉链表 二叉链表少了双亲域
    ElemType key;//结点值
    struct BiTree *left;//左孩子
    struct BiTree *right;//右孩子
    struct BiTree *p;//双亲
}BiTNode,*BiTree;

/*基于关键词的查找*/
//递归表示
BiTree Search_BST(BiTree T, ElemType k)
{
    if (T != NULL&&T->key != k)
    {
        if (k < T->key)
            return Search_BST(T->left,k);
        else
            return Search_BST(T->right,k);
    }
    return T;
}
//迭代表示
BiTree Interative_Search_BST(BiTree T, ElemType k)
{
    while (T != NULL&&T->key != k)
    {
        if (k < T->key)
            T = T->left;
    else
            T = T->right;
    }
    return T;
}



/*最大关键字元素和最小关键字元素的查找*/
BiTree Tree_Minimum(BiTree T)
{
    while (T->left != NULL)//找到最左下的元素
        T = T->left;
    return T;
}

BiTree Tree_Maximum(BiTree T)
{
    while (T->right != NULL)//找到最右下的元素
        T = T->right;
    return T;
}

/*对某结点的后继和前驱的查找*/
BiTree  Tree_Successor(BiTree T)//查找后继
{
    if (T->right != NULL)//T有右孩子,返回右子树的最小值
        return Tree_Minimum(T->right);
    BiTree y;
    y = T->p;//y为T的双亲
    while (y != NULL&&T == y->right)//直到找到一个结点是这个结点的双亲的左孩子 返回这个双亲
    {
        T = y;
        y = y->p;
    }
    return y;

}

BiTree Tree_Predecessor(BiTree T)//查找前驱
{
    if (T->left != NULL)
        return Tree_Maximum(T->left);
    BiTree y;
    y = T->p;
    while (y != NULL&&T == y->left)
    {
        T = y;
        y = y->p;
    }
        return y;

}

/*二叉搜索树的插入*/
//note:要对搜索树结构进行修改
void InsertBST(BiTree &T, ElemType e)//传入二叉树的根结点地址  note:《算法导论》传的是T.root 说明定义了另一个结构体存树的相关信息 如根结点地址 结点数等
{
    BiTree z, x, y=NULL;
    //对新增结点进行初始化,现在要修改的是它的双亲和它双亲的left或right
    z = (BiTree)malloc(sizeof(BiTNode));
    if (z != NULL)//空间申请成功
    {
        z->key = e;
        z->left = z->right=NULL;
    }
    x = T;
    while(x != NULL)
    {
        y = x;
        if (z->key < x->key)//z应该插入到左半部分
            x = x->left;
        else
            x = x->right;
    }//循环跳出后 x=NULL, x的位置即z要插入的位置 y的位置为z的双亲的位置
    //下面处理z和y的关系
    z->p = y;

    if (y = NULL)//说明是空树
        T = z;//新插入的z即为根结点
    else if (z->key < y->key)//z为y左孩子
        y->left = z;
    else
        y->right = z;
}
/*这个函数用一个以v为根的子树来替换一个以u为根的子树,二叉树的删除操作要用到*/
void Transplant(BiTree &T, BiTree u, BiTree v)
{
    if (u->p == NULL)//u没有双亲,说明u为根结点
        T = v;
    else if (u->p->left == u)//若u是其双亲的左子树
        u->p->left = v;
    else
        u->p->right = v;
    if (v != NULL)//要考虑v是否为空
        v->p = u->p;
}

/*对二叉树的删除操作*/
void DeleteBST(BiTree &T, BiTree z)//以T为根结点的二叉搜索树中删除结点z
{
    if (z->left == NULL)//第一种情况:要删除的结点没有左孩子 包含了z只有右孩子和右孩子为NULL即z没有孩子的情况 ,z右孩子代替z
        Transplant(T, z, z->right);
    else if (z->right == NULL)//第二种情况:z有且仅有非NULL左孩子(因为左孩子为NULL则说明没有孩子,这种情况上面已经包含了)z左孩子代替z
        Transplant(T, z, z->left);
    else
    {
        BiTree y = Tree_Minimum(z->right);
        if (y != z->right)//若z的右孩子不是z的后继 说明以右孩子为根的子树最小的那个结点才是z的后继  这个时候这个结点一定没有左孩子!!!
        {
            Transplant(T, y, y->right);//用y自己的右孩子来替代y 
        //  y->p = z->p;//???这一步不用吗???不用  因为后面还要将y Transplant到z 故只用处理好p的子树部分即可
            y->right = z->right;//并置y为z的右孩子的双亲
            y->right->p = y;

        }//处理完以后继结点y为根的子树后(包含本来y就是z的右孩子的情况)
        Transplant(T, z, y);
        y->left = z->left;
        y->left->p = y;
    }
}
notes:

1.查询二叉搜索树,对于大多数计算机,用迭代方式比用递归效率要高得多。
2.《算法导论》中函数传入的是T.root 应该有个类似下面形式的结构体定义,T是Tree类型的变量,我的函数中传入的T默认是根结点地址。

typedef struct{
    BiTree root;//根结点地址
    int nodenum;//结点数量
    //其他信息,如树的类型(二叉搜索树,红黑树,AVL树,B-/B+树)blablabla
}Tree;
sdio wifi 移植 介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3 阅读详情

相关推荐

字节跳动程序媛教你如何刷算法题:面试手撕代码我就没怕过

本人上一次刷题还是大一的C语言期末考试……但是面试中算法考核截止上岸前一直保持着100%正确率的光辉记录。 本文将给你指明一条刷题的决胜指南。并从算法的重要性、题库的选择以及刷题的三大步骤分别进行讲解,彻底解决你所有关于面试算法所有的困扰。

Stay Hungry Stay Foolish 求知若饥 虚心若愚 2万+

【数据结构】C++实现之二叉树结构(一)

1. 概念 1.1 二叉树的定义 二叉树( Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成,且具有以下特点: 1.2 二叉树的特点 1)每个结点最多有两颗子树,结点度最大为二 2)左子树和右子树是有顺序的,次序不能颠倒 3)即使某结点只有一子树,也要区分左右子树 4)具有5种形态...

qq_32643313的博客 2367

ST7102驱动移植与调试实战

本文详细介绍了在君正T40平台上移植和调试ST7102 LCD驱动芯片的实战经验。内容涵盖硬件接口配置、时序参数调整、寄存器初始化序列编写及常见问题解决,重点解析了ST7102单芯片集成显示与触控功能的特性,为嵌入式设备显示驱动开发提供实用指南。

k6l7m8n9的博客 1410

小李子的数据结构

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int TElemType; typedef struct BiTNode { TElemType data; BiTNode *lchild, *rchild; }BiTNode,*BiTree; void InitBiTree(Bi...

lizhuojia123的博客 344

双轮差动机器人SLAM实战:轮速里程计从建模到精度验证(附Matlab代码)

本文详细介绍了双轮差动机器人SLAM系统中轮速里程计的实现全流程,包括核心原理、建模方法、Matlab代码实现及精度验证。通过轮速仪数据建模和连续积分算法,提升定位精度,并附有完整的误差分析和工程优化技巧,为开发者提供实用参考。

weixin_29050271的博客 223

习题6-3 使用函数输出指定范围内的完数

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

cutto的博客 862

二叉排序树查找操作

当函数返回值为函数结果状态代码时,函数定义为Status类型。 递归查找二叉排序树T中是否存在Key 指针 f 指向 T 的双亲,其初始调用值为NULL 若查找成功,则指针p指向该数据元素结点,并返回TRUE#include typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode,*

我是一只软萌妹? 1434

WPF在特定领域的应用:打造一款专业的图像编辑工具

WPF在特定领域的应用:打造一款专业的图像编辑工具,在软件开发的广阔领域中,Windows Presentation Foundation(WPF)以其强大的图形渲染能力和丰富的用户界面控件,为开发者提供了构建高性能、美观应用程序的平台。图像编辑工具作为一种对图形处理要求极高的应用类型,WPF 的特性使其成为理想的选择。本文将深入探讨如何使用 WPF 打造一款专业的图像编辑工具,涵盖从基础概念到实际代码实现的各个方面。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

二叉搜索树(Binary Search Trees)

二叉搜索树:每个元素都有一个唯一的值,而且所有元素的值各不相同;根节点左子树中的值比根节点的值小;根节点右子树中的值比根节点的值大;根节点的左右子树也都是二叉搜索树。 带索引的二叉搜索树(indexed binary search trees):基于上面的二叉搜索树,每个元素拥有一个LeftSize域,其值等于该节点左子树的元素数加1,同时它给出了该节点在其子树中的排名,如上面8的LeftS...

架构设计 353

14、多标签分类与卷积神经网络在医学图像处理中的应用

本文探讨了多标签分类与卷积神经网络(CNN)在医学图像处理中的应用。文章详细介绍了多标签分类的概念和挑战,以及如何通过CNN进行高效、准确的分类任务。内容涵盖模型设计、损失函数选择、数据增强技术、类别权重调整等关键技术点,并结合实际案例,如白内障手术工具检测、视网膜血管分割等,展示了CNN在医学图像分析中的强大潜力。此外,还讨论了模型优化策略及面临的挑战与解决方案。

t8u9v0的博客 191

Happycapy深度解析:AI智能体的“iPhone时刻“来了?

从理论到实践深度解析了融合OpenClaw和ClaudeCode优点的超强智能体工具Happycapy

program哲学 457

数据结构 树&图

二叉树 二叉树:每个结点最多有2个子结点 二叉树的代码实现 结构体 typedef int BTElemType; typedef struct BiTreeNode { BTElemType data; BiTreeNode* lChild; BiTreeNode* rChild; }*BiTree; 初始化 由于很多语句都需要判断结点存不存在,因此二叉树的初始化就是T=NULL 相似的,之后在创建树时,每个结点的左右孩子一开始也需要=NULL 保证结点被声明..

weixin_53459056的博客 960

Redhawk:toggle rate从哪来?

redhwak中toggle rate的相关设置

m0_61544122的博客 8113

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现,那么接下来我们将进一步的学习二叉树,在此会先后学习到二叉搜索树、AVL树、红黑树;通过这些的学习将让我们更易于理解后面set、map、哈希等的使用以及对底层结构的了解。在此先本篇中我们将了解二次搜索树的概念以及实现二叉搜索树插入、删除等的操作,在了解了这些之后相信在下一篇的set和map的学习你将轻松许多,接下来就开始本篇的学习吧!!!

mljy.博客 3786

VB摄像头监控

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C++】二叉搜索树

从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。 最多查找高度次,走到到空,还没找到,这个值不存在非空右子树的所有值大于根节点的值 左右子树都是二叉搜索树第一个不满足,因为值为5的节点在值为10的节点的右边,正常来说10的右边都应该比10大分为两种情况 若插入的值在二叉树中不存在,则通过比较进行插入若插入11,因为11比8大,所以跟10比较,而11比10大,所以走10的右子树14,14与11比较,因14>11,所以走14的左子树13,11与13比较,因13>11,故作为13的左子树,遇见NU

qq_62939852的博客 2149

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【二叉搜索树】二叉搜索树的用法以及实现

二叉搜索树的用法以及实现

有趣的中国人的博客 1657

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

二叉搜索树详解

二叉搜索树(Binary Search Tree)顾名思义是一种特殊的二叉树,主要用于查找与去重,与我们常见的二叉树不同,他对于结点的值有特殊的要求,二叉搜索树的定义如下主要有以下3点。这里我们的33大于15,在15的右子树上面,仿佛没有错,但是我们以30为父节点来看,33大于30,却出现在30的左子树上面,这是错误的!删除只有一个孩子的结点相对来说还是比较简单的,我们要找到要删除节点的父亲结点,并判断是父亲节点的左边还是右边,子节点的左边还是右边,最后链接起来就可以了。修改如下图后结果就是正确的了。

2301_79964905的博客 1213

二叉搜索树——BinarySearchTree

本文主要介绍了二叉搜索树的概念,特性,和实现,以及在介绍了面试中常考的一些题型

终为nullptr 1610
上一篇: 树与二叉树的概念
下一篇: 二叉树的遍历
Peggy_Chang
博客等级 码龄11年 21粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值