当前位置: 首页 > news >正文

C++笔记15•数据结构:二叉树之二叉搜索树•

二叉搜索树

1.二叉搜索树

概念:

二叉搜索树又称二叉排序树也叫二叉查找树,它可以是一棵空树。
二叉树具有以下性质:
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树;

2.二叉搜索树功能

1. 二叉搜索树的查找
a 、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
b 、最多查找高度次,走到到空,还没找到,这个值不存在。
2. 二叉搜索树的插入
插入的具体过程如下:
a. 树为空,则直接新增节点,赋值给 root 指针
b. 树不空,按二叉搜索树性质查找插入位置,插入新节点
3.二叉搜索树的删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回 , 否则要删除的结点可能分下面四种情 况:
a. 要删除的结点无孩子结点
b. 要删除的结点只有左孩子结点
c. 要删除的结点只有右孩子结点
d. 要删除的结点有左、右孩子结点
看起来有待删除节点有 4 中情况,实际情况 a 可以与情况 b 或者 c 合并起来,因此真正的删除过程如下:
情况 b :删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点 -- 直接删除
情况 c :删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点 -- 直接删除
情况 d:在它的右子树中寻找中序下的第一个结点( 也就是删除节点的左子树中最大的值或者删除节点的右子树中最小的值 ),用它的值填补到被删除节点 中,再来处理该结点的删除问题 -- 替换法删除
删除9、16、3、10节点
其中:节点9和16可以直接删除。3、10节点需要用替换法删除
节点3:需要用2节点或7节点来替换
节点10:需要用9节点或12节点来替换

3.二叉搜索树的性能 

最优情况下,二叉搜索树为完全二叉树 ( 或者接近完全二叉树 ),其平均比较次数为:时间复杂度O(log2(N))
最差情况下,二叉搜索树退化为单支树 ( 或者类似单支 ) ,其平均比较次数为:时间复杂度 O(N)
解决方法:用三叉链的红黑树或AVL树,一般常用红黑树

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32 系列MCU 开发利器 STM32CubeIDE
  • Pandas_[‘index‘]_is_not_found_in_axis
  • 解读:以RTC为基,AI为脑的“超拟人”AI实时互动解决方案
  • 【IEEE出版,IEEE Xplore等多数据库检索】第五届智能设计国际会议(ICID 2024,10月25-27)
  • Excel如何把表格变成图表
  • 什么叫做 “沿着晶体平面偏析”
  • 优质的产业园都在怎么做运营?
  • 想开公司不知道需要什么资料?
  • NXP,S32K1XX J-Link调试器 J-Flash烧录指南
  • 项目实战系列三: 家居购项目 第三部分
  • 【开源免费】基于SpringBoot+Vue.JS图书个性化推荐系统(JAVA毕业设计)
  • 【Bug】Ubuntu22.04英伟达驱动安装失败,重启后服务器卡在进入系统/grub的页面
  • WS2812B驱动
  • MacBook真的不能打游戏吗?Mac打游戏会损坏电脑吗?苹果电脑怎么玩游戏
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • [笔记] php常见简单功能及函数
  • 《Java编程思想》读书笔记-对象导论
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 4. 路由到控制器 - Laravel从零开始教程
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Angular 4.x 动态创建组件
  • Apache Zeppelin在Apache Trafodion上的可视化
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Just for fun——迅速写完快速排序
  • Python_OOP
  • VUE es6技巧写法(持续更新中~~~)
  • 关于extract.autodesk.io的一些说明
  • 关于List、List?、ListObject的区别
  • 技术胖1-4季视频复习— (看视频笔记)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 深入 Nginx 之配置篇
  • 使用common-codec进行md5加密
  • 微信小程序填坑清单
  • 用 Swift 编写面向协议的视图
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $nextTick的使用场景介绍
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (搬运以学习)flask 上下文的实现
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (接口封装)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (小白学Java)Java简介和基本配置
  • (转) Face-Resources
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自用)交互协议设计——protobuf序列化
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .htaccess配置重写url引擎
  • .Net 6.0 处理跨域的方式
  • .Net MVC + EF搭建学生管理系统