【数据结构】平衡二叉树
(百度百科)平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法 平衡二叉树的常用算法有红黑树、AVL、Treap等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为logN,其各操作的时间复杂度(O(logN))同时也由此而决定。但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度。
还没有认真学习数据结构之前,常看到或听到什么平衡二叉树、AVL还有红黑树之类的数都是各种独立的树结构,今天通过学习,也算是理清楚平衡二叉树的一些归纳总结了。原来AVL和红黑树都是二叉平衡树,只不过是基于二叉平衡树的不同算法而已。
二叉平衡树的一些算法有:
AVL
AVL是最先发明的自平衡二叉查找树算法。在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
红黑树
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。
Treap(树堆)
Treap是一棵二叉排序树,它的左子树和右子树分别是一个Treap,和一般的二叉排序树不同的是,Treap纪录一个额外的数据,就是优先级。Treap在以关键码构成二叉排序树的同时,还满足堆的性质(在这里我们假设节点的优先级大于该节点的孩子的优先级)。但是这里要注意的是Treap和二叉堆有一点不同,就是二叉堆必须是完全二叉树,而Treap并不一定是。
伸展树
伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。它的优势在于不需要记录用于平衡树的冗余信息。在伸展树上的一般操作都基于伸展操作。
SBT
Size Balanced Tree(简称SBT)是一自平衡二叉查找树,是在计算机科学中用到的一种数据结构。它是由中国广东中山纪念中学的陈启峰发明的。陈启峰于2006年底完成论文《Size Balanced Tree》,并在2007年的全国青少年信息学奥林匹克竞赛冬令营中发表。由于SBT的拼写很容易找到中文谐音,它常被中国的信息学竞赛选手和ACM/ICPC选手们戏称为“傻B树”、“Super BT”等。相比红黑树、AVL树等自平衡二叉查找树,SBT更易于实现。据陈启峰在论文中称,SBT是“目前为止速度最快的高级二叉搜索树”。SBT能在O(log n)的时间内完成所有二叉搜索树(BST)的相关操作,而与普通二叉搜索树相比,SBT仅仅加入了简洁的核心操作Maintain。由于SBT赖以保持平衡的是size域而不是其他“无用”的域,它可以很方便地实现动态顺序统计中的select和rank操作。
转载于:https://www.cnblogs.com/wcd144140/p/5481969.html
【数据结构】平衡二叉树相关推荐
- 数据结构---平衡二叉树
数据结构-平衡二叉树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlTree { ...
- 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解
数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...
- 数据结构——平衡二叉树的的旋转问题
在学习有关数据结构平衡二叉树的时候,我就特别困惑在二叉查找树中是如何将树旋转和交换孩子的.这里,我将自己的总结写下来,喜欢大家一起交流进步! 这个需要旋转的情况大体可以·分为4种情况.分 ...
- 数据结构-平衡二叉树(AVL树)
目录 1,平衡二叉树的介绍 1.1,二叉排序树存在的问题 1.2,平衡二叉树 1.3,平衡二叉树的创建 1.4,平衡二叉树的查找 2,代码实现 2.1,平衡二叉树的节点类型 2.2,LL旋转(单右旋转 ...
- 数据结构 — 平衡二叉树
目录 文章目录 目录 平衡二叉树 平衡二叉树 平衡二叉查找树具有如下性质: 若左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值: ...
- 数据结构 - 平衡二叉树
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 平衡二叉 ...
- 浅谈数据结构-平衡二叉树
平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...
- 数据结构——平衡二叉树
一.平衡二叉树的定义 平衡二叉树(AVL 树)仍然是一棵二叉查找树,只是在其基础上增加了"平衡"的要求.所谓平衡是指,对 AVL 树的任意结点来说,其左子树与右子树的高度之差的绝对 ...
- 数据结构 平衡二叉树avl c++
平衡二叉树:一颗空树,或者是具有以下性质的二叉树 左子树和右子树都是平衡二叉树 左子树和右子树的深度只差不超过1 把二叉树节点的平衡因子BF(Balance Factor)定义为该节点的左子树深度减去 ...
- [ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋
0 引出 数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在 回顾:二叉搜索树 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需 ...
最新文章
- 大佬带你深入浅出Lua虚拟机
- No module named 'mxnet.gluon'
- 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
- python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁
- agv系统介绍_重载AGV小车主要结构及导航原理是什么?
- linux dns区域传送,Linux DNS服务器主从复制及区域传送
- 昨天做的事情和今天需要做的事情
- Android Studio调试功能使用总结【转】
- 简易电影售票系统(附部分总结)
- Maui Shell 来了,开启 Linux 桌面新时代!
- Win10 安装 SQL Server 2008 与使用指南
- 关于超实数单子的说明
- StringPool详解
- USB设备被识别流程
- Html5 学习笔记 【PC固定布局】 实战5 咨询页面 侧栏
- 生物制药专业与计算机应用文献,生物制药技术专业求职信范文3篇
- 【控制工程】基础知识
- 实用技巧:六招教你去掉图片上的文字
- DDR4 设计概述以及分析仿真案例
- 如何写3DMAX的插件
热门文章
- 百度SEO最新小某云商城系统源码 免授权V1.61版
- 学生社团管理系统java_基于JavaEE的学生社团管理系统的设计与实现
- vue怎么编辑已有视频_手机制作短视频、VLOG用啥App?~~
- 征途手游2新开区服务器维护多久,《征途2手游》开启新服“星火燎原”
- 微信独立精彩互换抢红包系统源码ThinkPHP开源版
- 如何创建一个标准的Windows服务
- cnblogs客户端发贴解析,Post,Get分析
- MongoDB 教程番外篇之添加用户及设置用户权限 ( Rockmongo登陆设置 )
- Magento 获取原价格和打折价格 get Special price or Regular Price in magento
- 妈咪,我找到了!15个实用的Linux find命令示例