首页 > 其他分享 >十三、二叉搜索树

十三、二叉搜索树

时间:2024-12-24 10:27:49浏览次数:5  
标签:左子 结点 val 十三 右子 二叉 搜索

一、概念

1、定义

性质

1、空树是二叉搜索树。

2、若它的左子树不为空,则右子树所有结点的值均小于它的根结点的值。

3、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值。

4、它的左右子树均为二叉搜索树。

对于任意一棵子树而言,它的根结点的值一定大于左子树所有结点的值,且一定小于右子树所有结点的值。

2、应用

二叉搜索树的前提是二叉树,并采用了递归的方式进行定义,它的结点间满足偏序关系,左子树根结点的值一定比父节点小,右子树根结点的值一定比父结点大。

二叉搜索树为了提高搜索速度,对其进行中序遍历,得到的序列是一个递增序列。

二、二叉搜索树的链式存储

一般用孩子表示法定义一个二叉搜索树的结点。

二叉搜索树需要有一个数据域(结点值),二叉搜索树结点的左儿子结点的指针,没有左儿子结点时,值为空。二叉搜索树结点的右儿子结点的指针,没有右儿子时,值为空。

三、结点查找

概念

在树上查找某个数是否存在。

步骤

对于要查找的数val, 从根结点出发,分四种情况判断。

1、若为空树, 直接返回false。

2、若 val 的值小于根结点的值, 则递归返回左子树的 查找结果。

3、若 val 的值大于根结点的值, 则递归返回右子树的 查找结果。

4、若找到val, 则直接返回true。

四、结点插入

概念

给定一个值,生成结点后,插入到树上某个位置,并且保持这棵树还是二叉搜索树。

步骤

对于要插入的数 val,从根结点出发,分四种情况判断。

1、若为空树,则创建一个值为 val 的结点并返回。

2、若 val 的值小于树根结点的值,则递归执行插入左子树,并返回插入结果作为新的左子树。

3、若 val 的值大于树根结点的值,则递归执行插入右子树,并返回插入结果作为新的右子树。

4、直接返回当前树的根结点。

五、结点删除

概念

在树上删除给定值的结点

步骤

对于要删除的数val,从根结点出发,分七种情况讨论

1、如果当前结点为空,则直接返回空树。

2、如果要删除的值小于当前结点的值,则递归调用左子树,进行结点的删除。

3、如果要删除的值大于当前结点的值,则递归调用右子树,进行结点的删除。

4、如果当前结点是一个叶子结点,即没有左子树和右子树,那么删除该节点,并返回空树。

5、如果当前结点只有右子树而没有左子树,那么删除当前结点并返回右子树。

6、如果当前结点只有左子树而没有右子树,那么删除当前结点并返回左子树。

7、如果当前结点既有左子树又有右子树,那么找到当前结点右子树中的最小值的结点(即右子树中最左边的结点),将当前结点的值替换为这个最小值的结点的值,然后递归删除右子树中该最小值的结点。

六、总结

二叉搜索树的 查找 、插入 、和 删除 完全取决于二叉搜索树的形状,若接近完全二叉树,则为O(log n),如果是斜树,则这三个操作近似成线性表,则为O(n)。

标签:左子,结点,val,十三,右子,二叉,搜索
From: https://blog.csdn.net/2302_80881466/article/details/144509799

相关文章

  • 大邻域搜索算法
    大邻域搜索算法(LargeNeighborhoodSearch,LNS)是一种用于求解组合优化问题的启发式算法。以下是对大邻域搜索算法的详细解释:一、基本概念大邻域搜索算法中的“大”指的是邻域变动的范围相对于一般的邻域搜索算法而言更广。该算法的核心思想是在一个比较大的解空间邻域内寻找更好......
  • 变邻域搜索算法
    变邻域搜索算法(VariableNeighborhoodSearch,VNS)是一种基于局部搜索的启发式算法,它通过在不同的邻域结构之间切换来逃避局部最优解,并逐步改进解的质量。以下是对变邻域搜索算法的详细解释:一、算法原理变邻域搜索算法的基本思想是在搜索过程中系统地改变邻域结构集来拓展搜索范围......
  • 【电商搜索】CRM: 具有可控条件的检索模型
    【电商搜索】CRM:具有可控条件的检索模型目录文章目录【电商搜索】CRM:具有可控条件的检索模型目录文章信息摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)相关工作后续优化方向后记https://arxiv.org/pdf/2412.13844文章信息......
  • LeetCode:222.完全二叉树节点的数量
    跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!代码随想录LeetCode:222.完全二叉树节点的数量给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节......
  • 第六章 二叉树part 01
    又是一种神奇的数据结构,可以让数据查询效率以指数级递减首先需要理解并掌握的是二叉树的遍历,遍历还分为两种,一种是递归遍历,代码简单到令人发指;另一种是迭代(是不是就是递推)今天只能先开个头,明天再补齐二叉树的递归遍历structTreeNode{intval;TreeNode*left;......
  • 【电商搜索】文档的信息论生成聚类
    【电商搜索】文档的信息论生成聚类目录文章目录【电商搜索】文档的信息论生成聚类目录文章信息概览研究背景技术挑战如何破局技术应用主要相关工作与参考文献后续优化方向后记文章信息https://arxiv.org/pdf/2412.13534概览本文提出了一种基于信息论的生成......
  • 【LeetCode】LCR 175.计算二叉树的深度
    题目链接:LCR175.计算二叉树的深度题目描述:思路一(深度优先搜索):使用深度优先搜索算法进行二叉树后序遍历复杂度分析:时间复杂度O(N):N为树的节点数量,计算树的深度需要遍历所有节点空间复杂度O(N):最差情况下(当树退化为链表时),递归深度可达到N/***Definitionfor......
  • 对称二叉树(递归)
    给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • 翻转二叉树(递归)
    给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]/***Definitionforabinarytreenode.*structTreeNode{*......
  • 二叉树的最大深度(递归)
    给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例1: 输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2 /***Definitionforabinarytreenode.*structTree......