【一】二叉搜索树的概念

定义:二叉搜索树又称二叉排序树,他或者就是一棵空树,是具有以下性质的二叉树:

1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。

2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。

3.它的左右子树也分别为二叉搜索树。

从上述概念可以看出,二叉搜索树具有以下特性:

1.二叉搜索树中最右侧的节点是数中最小的节点,最右侧节点一定是树中最大的节点

2.采用中序遍历二叉搜索树,可以得到一个有序的序列。

【二】二叉搜索树的查找

既然称之为二叉搜索树,因此这棵树的最主要的作用就是查询,而其查询原理特别简单,原理是这样的:

在根节点为不为空的情况下:如果根节点key==查找key,返回true

如果根节点key>查找key,在其左子树查找

如果根节点key<查找key,在其右子树查找

如果不符合以上条件,就返回false

插入和删除操作,也都是建立在查找的基础上的,那么二叉搜索树的查找效率是多少呢?

代码如下:

bool Find(const K& key){Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_left;}else if (cur->_key > key){cur = cur->_right;}else{return true;}}return false;}

【三】二叉树查询性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能,对于n个节点的二叉搜索树,若每个元素查找的概率相等,那么搜索的次数就是二叉搜索树的深度,就是节点越深,比较的次数越多。

最优的情况下:二叉搜索树为完全二叉树,其平均比较次数为:log2N

最差情况下:二叉搜索树退化为单只树,比较次数为N

这种最差情况遗留的问题就交给了AVL树来解决。

【四】AVL树的概念

二叉搜索树虽然可以缩短查找的效率,但如果数据有序或者是接近有序二叉树就会退化为单只树,查找元素相当于在顺序表中查找元素,效率低下,因此俄罗斯两个大佬数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种 解决上述问题的方法:当二叉搜索树插入新节点后,如果能保证每个节点的左右子树高度之差的绝对值不超过1(需要对树中的节点进行调整),就可以降低树的高度,从而减少平均搜索长度。

一棵AVL树或者是空树,是具有以下性质的二叉树:

1.它的左右子树都是AVL树

2.左右子树高度之差(简称平很因子)的绝对值不超过(-1/0/1)

如果一颗二叉搜索树是高度平衡的,他就是AVL树,如果他有n个节点,其高度可以保持在O(log2N),搜索时间复杂度为O(log2N)。

【五】AVL树节点的定义

为了AVL树实现简单,AVL树节点在定义时维护一个平衡因子,具体节点定义如下:

template<class K,class V>struct AVLTreeNode
{pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTreeNode<K, V>* _right;AVLTreeNode<K, V>* _parent;//左右子树的高度差int _bf;//初始化参数列表AVLTreeNode(const pair<k, v>& kv):kv(kv),_left(nullptr),_right(nullptr),_parent(nullptr),bf(0){}
};

注意:当前节点的平衡因子=右子树高度-左子树高度,但不是每棵树,都必须有平衡因子,这只是其中的一种实现方式。

【六】AVL树的插入

AVL树就是在二叉搜索树上引入了平衡因子,因此AVL树也可以看成是二叉搜索树,那么AVL树的插入过程可以分为两步:

1.按照二叉搜索树的方式插入新节点

2.调整节点的平衡因子                                             也就是:

先按照二叉搜索树的规则将节点插入到AVL树中,新节点插入后,AVL树的平衡性可能会遭到破坏,此时就需要更新平衡因子,并检测是否破坏了AVL树的平衡性,pcur插入后,pparent的平衡因子分为三种情况,-1,0,1,分为以下两种情况:

1.如果pcur插入到pparent的左侧,只需要给pparent的平衡因子-1即可

2.如果pcur插入到pparent的右侧,只需要给pparent的平衡因子+1即可

此时:pparent平衡因子就有三种情况,0,正负1,正负2

如果pparent的平衡因子为0,说明插入之前pparent的平衡因子为正负1,插入后被调整为0,此时满足AVL树的性质,插入成功

如果pparent的平衡因子为正负1,说明插入前pparent的平衡因子为正负0,插入后被调整为正负1,此时满足AVL树的高度是增加一,需要继续向上更新。

如果pparent的平衡因子为正负2,则pparent的平衡因子违反平衡树的性质,需要对其进行旋转处理

cur插入后,parent的平衡因子一定遭到破坏,必须对parent的平衡因子进行调整。

以上就是关于这期的全部内容,如果有问题的话还请于评论区斧正,如果觉得写的还不错的话,还请一件三连,毕竟码字不易。

《二叉平衡树(一)》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 洛谷P1083 [NOIP2012提高组Day2T2]借教室
  2. boost::contract模块实现lambda表达式的测试程序
  3. alsa声音编程介绍
  4. Entity Framework Core 2.0 新特性
  5. vue-cli 3.0 使用全过程讲解
  6. Python 偏函数
  7. JavaSE学习--正则表达式
  8. 2020-09-15
  9. 【BIM入门实战】渲染器Vray for 3d max 2018图文安装教程
  10. %appdata% 代表什么?
  11. [Tushare] 通过复权因子计算前复权价格、后复权价格
  12. ip和ifconfig命令添加及删除虚拟IP
  13. Entry name 'kotlin/collections/MapWithDefault.kotlin_metadata' collided
  14. 宝宝起名神器小程序源码
  15. 只会写代码的程序员不是好程序员
  16. Vue项目中用高德地图实现定位
  17. 在vmware虚拟机中的ubuntu出现s001.vmdk的操作失败(磁盘空间不足)并影响ubuntu的启动问题
  18. 生化环材CSDN文章索引
  19. pygame.USEREVENT创建多个用户事件
  20. 通过关键字采集PDD商品列表

热门文章

  1. javascript根据单元格内容动态合并相同内容单元格
  2. 智慧校园管理系统,精细化+网格化
  3. php怎么把报错打开_php服务器报错怎么开启?
  4. 草图logo绘画演绎AE模板
  5. 电商运营中的五个数据陷阱
  6. 苹果机和Android,苹果机和安卓机各有优缺点,但苹果机这四点让人顶不住
  7. Maven详解(第二节)
  8. 大数据分析的好帮手 Excel函数应用的顶级实战 Excel数据分析应用+VBA实战 24G课程
  9. 游戏提交已14天,状态仍是waiting for review,谁比我更惨
  10. python有参函数和无参函数的区别_构造函数的有参和无参的区别,构造函数的参数是派什么用场的?...