二叉搜索树

Android perfetto 简介 android linux 性能优化 原理及操作 阅读详情
概述:

二叉搜索树中的关键词总是以满足二叉搜索树性质的方式来存储:
设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;
[亚信线上教学] AX58100: EtherCAT从站设备仿真功能设计教学 什么情况需要开启EtherCAT从站设备仿真功能呢? 一般来说, 当EtherCAT从站产品,不需要使用额外的微控制器介入,或使用不具备EtherCAT从站通讯协议栈的微控制器一同协作的情况下,就必须开启EtherCAT从站设备仿真功能,这样EtherCAT主站才能够正常设置从站设备的工作状态. 亚信AX58100 EtherCAT从站控制芯片的优点 AX58100 EtherCAT从站控制器, 集成2个百兆以太网Phis, 并支持一些额外的控制接口, 例如脉冲宽度调变, 增量, 霍尔编码器, . 阅读详情

相关推荐

云模型在综合评价过程中的应用

目录 1 云模型标尺(标准云模型)的构建方法 1.1 通过正态云的“3En 规则”来表示评价论域 1.2 通过论域的边界值隶属度相等来表示评价论域 1.3 通过黄金分割法来表示评价论域 2 确定评价结果的过程 2.1 基本云发生器 2.2 X条件云发生器 2.3 两种方法的区别 综合评价问题一般分为以下六个步骤 1、明确评价目的; 2、确定被评价对象; 3、建立评价指标体系(包括收集评价指标的原始值、评价指标的若干预处理等); 4、确立与各项评价指标相对应的权重系数; 5、选..

weixin_62223576的博客 1万+

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

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

qq_32643313的博客 2367

新出的智谱GLM-4.7很牛逼?

Zhipu AI(智谱)最近发布的 GLM-4.7 再次刷新了开源大模型的天花板。作为一款约 400B 参数规模的 MoE 模型,它不仅在传统的代码与推理任务上超越了 DeepSeek-V3.2 和 Kimi-K2 等强力对手,更通过**“保留思考(Preserved Thinking)”和“交错思考(Interleaved Thinking)”**等架构级创新,重新定义了 Agentic Workflow 的设计范式。

kakaZhui的博客 2395

小李子的数据结构

#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

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

Coze 打通飞书多维表格,实现数据增删改查操作实战详解

基于Coze 打通飞书多维表实现数据录入系统实战详解

congge 5779

二叉排序树查找操作

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

我是一只软萌妹? 1434

21、空间数据处理中的克里金方法及应用

本文介绍了空间数据处理中的克里金方法,特别是带外部漂移的克里金法(KED)及其在遥感数据融合和支持变化问题中的应用。讨论了克里金方法的基本原理、优缺点以及在不同空间分辨率遥感图像融合中的具体操作流程。同时,还涉及了地统计数据融合和支持变化问题的解决方案,包括块克里金法、面到点克里金法和多边形克里金法等。

gold的博客 86

二叉搜索树(Binary Search Trees)

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

架构设计 353

1 初识智能化测试

非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。

Criss@陈磊 2625

R语言中如何获取前向选择(forward selection)选出的变量

前向选择是一种常用的特征选择方法,可以在给定一个预测模型的情况下,逐步添加变量来确定最佳的预测模型。在R语言中,可以使用适当的函数和库来执行前向选择,并获取选出的变量。以下是一个详细的步骤,展示了如何使用R语言执行前向选择并获得选出的变量。通过按照上述步骤,你可以使用R语言执行前向选择,并获取选出的变量。记住,前向选择是一种特征选择方法,可以根据不同的评估指标选择最佳的预测模型。接下来,准备用于前向选择的数据。使用"summary"函数查看前向选择的摘要,并使用"which"函数获取被选中的变量。

WangWEel的博客 924

数据结构 树&图

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

weixin_53459056的博客 960

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

C++《二叉搜索树》

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

mljy.博客 3786

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

有趣的中国人的博客 1657

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

二叉搜索树详解

二叉搜索树(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、付费专栏及课程。

余额充值