二叉排序树

二叉排序树的定义

二叉排序树也称为二叉查找树。二叉排序树或者是一棵空树,或者是一棵具有如下特性的非空为茶树

  1. 若左子树非空,则左子树所有结点关键字值均小于根结点的关键字值
  2. 若右子树非空,则右子树所有结点关键字值均大于根结点的关键字值
  3. 左右子树本身也分别为一棵二叉排序树

总结来说:左子树结点值 < 根结点值 < 右子树结点值

二叉排序树的查找

步骤:

  1. 若根结点关键字值等于目标值,返回true
  2. 若根结点关键字值小于目标值 ,如果该根结点有左子树,则向左子树继续搜索;否则返回false
  3. 若根结点关键字值大于目标值 ,如果该根结点有右子树,则向右子树继续搜索;否则返回false
bool BST_search(TreeNode *root, int value){if(root->val == value) return true;if(root->val > value) {if(root->left) {BST_search(root->left, value);} else {return false;}} else {if(root->right) {BST_search(root->right, value);} else {return false;}}
}

二叉排序树的插入

步骤:

  1. 若根结点关键字值小于插入值 ,如果该根结点有左子树,则向左子树继续搜索;否则插入,作为根结点的左子树
  2. 若根结点关键字值大于插入值 ,如果该根结点有右子树,则向右子树继续搜索;否则插入,作为根结点的右子树
void BST_insert(TreeNode *node, TreeNode *insert) {if(node->val > insert->val) {if(node->left) {BST_insert(node->left, insert);} else {node->left = insert;}} else {if(node->right) {BST_insert(node->right, insert);} else {node->right = insert;}}
}

二叉排序树的构造

二叉树的构造需要与二叉树的插入相结合

void create_BST(vector<int> nums, BSTNode *root) { // root 的关键值是nums[0]int len = nums.size();int i = 1;while(i<len){BST_insert(root,nums[i]);i++;}
}

二叉排序树的删除

删除操作的实现过程按3种情况来处理:

  1. 若被删除结点node是叶子结点,则直接删除
  2. 若被删除结点只有一棵左子树或右子树,则让node的组数称为node双亲结点的子树,替代node的位置
  3. 若结点node只有左、右两棵子树,则令node的直接后继(或其直接前驱)替代node,然后从二叉树排序中删去这个直接后继(或其直接前驱)—— 本质上就是去找左子树的最大关键字值和右子树最小树值

总结来说就一个标准,删除的结点后使删除后BST依旧符合BST的基本约束,同时使整棵树改变最少

二叉排序树的查找效率

平均成功查找长度:ASL成功 = (层数)∗(同层节点个数)n\frac{(层数)*(同层节点个数)}{n}n(层数)∗(同层节点个数)​

平均失败查找长度:ASL失败 = (层数)∗(同层与该节点子节点情况类似个数)n+1\frac{(层数)*(同层与该节点子节点情况类似个数)}{n+1}n+1(层数)∗(同层与该节点子节点情况类似个数)​

详情参考之前文章文章【【数据结构-查找】1.通俗易懂讲解 —— 顺序-折半-分块查找】中的【折半查找】这一块

【数据结构-树】3.详解二叉排序树(理论+代码)相关推荐

  1. 数据结构树(Tree)详解

    树(tree) 树(Tree)的基本概念 定义 树的结构 二叉树 二叉树的特点 满二叉树 完全二叉树 二叉查找树(Binary Search Tree - BST,又称二叉排序树.二叉搜索树) AVL ...

  2. 数据结构之树结构详解

    树的定义 树是一种很特别的数据结构,树这种数据结构叫做"树"就是因为它长得像一棵树.但是这棵树画成的图长得却是一棵倒着的树,根在上,叶在下. 树是图的一种,树和图的区别就在于:树是 ...

  3. 数据结构与算法详解目录

    数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章  基 ...

  4. 数据结构--图(Graph)详解(三)

    数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...

  5. 数据结构--图(Graph)详解(二)

    数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...

  6. 数据结构--图(Graph)详解(一)

    数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...

  7. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

  8. 【Linux驱动开发】设备树详解(二)设备树语法详解

    ​ 活动地址:CSDN21天学习挑战赛 [Linux驱动开发]设备树详解(一)设备树基础介绍 [Linux驱动开发]设备树详解(二)设备树语法详解 [Linux驱动开发]设备树详解(三)设备树Kern ...

  9. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  10. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

最新文章

  1. .Net使用Redis详解之ServiceStack.Redis(七)
  2. 在Scrapy中使用Chrome中的cookie
  3. How to install OpenCV 3.x in Linux
  4. css平台HTDC币,是否应该从最新的设置中应用CSS规则?
  5. SAP Commerce Cloud deprecation机制
  6. jpypePython对象转JAVA_通过JPype和numpy将Java类型转换为Python
  7. vs2010 C#链接 ACCESS数据库
  8. SQLyog客户端 导入sql文件乱码的解决方法
  9. AI时代,运维和测试岗位如何开启第二春?
  10. 【Asp.Net】GridView控件中Datakeys和DataKeyNames的说明
  11. kodi教程_KODI添加电视直播+修改台标教程
  12. HCIE大师之路(二)——IPSec Over GRE综合实验
  13. 常见的系统设计规范(约束)
  14. 运维自动化之-----ansible之intnet和http协议技术 (10)
  15. java工单管理系统_企业工单管理系统--使用mybatis
  16. 金融大数据信用评分模型解析
  17. 计算机编程玫瑰花,c语言实现玫瑰花的方法
  18. 用深度学习keras的cnn做图像识别分类,准确率达97%
  19. Linux安装 Oracle 19C 实操
  20. 同一个浏览器开不同窗口使得session不同的方法

热门文章

  1. asp.net 上传大文件解决方案(转)
  2. EOS 智能合约源代码解读 (7)合约开发示例
  3. 《研磨设计模式》chap20 享元模式 Flyweight (4)总结
  4. C++ Primer 5th笔记(chap 11)关联容器---无序容器
  5. Linux网络配置与命令
  6. 算法—详细讲解单向循环链表的实现(python)
  7. 2020-11-23(彻底理解KMP)
  8. 西部数据 MyCloud 网络存储存在 RCE 漏洞
  9. win10下c/c++隐藏进程
  10. python实现键盘记录器