学习来源:计蒜客
平衡树1.定义
对于每个结点,左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1
为什么会出现这样一种树呢?
假如我们按照1-n的顺序插入到二叉排序树中,那么二叉排序树就退化成了一个有序链表,效率大大降低。
2.有关概念
所有平衡树基本由以下三个特征组成:
1.自平衡条件2.旋转操作
3.旋转的触发
平衡树通过设置合理的自平衡条件,使得二叉排序树的查找、插入等操作的性能不至于退化到 O(n)O(n),并且在进行二叉排序树的查找、插入等操作时进行判断,如果满足其中某个旋转的触发条件,则进行对应的旋转操作。
左旋和右旋:(我的理解)
左旋:右边的深度大于左边深度2以上,把它变成平衡树,叫左旋(因为要把右边的某些元素挪到左边)
右旋:左边的深度大于右边深度2以上,把它变成平衡树,叫右旋(因为要把左边的某些元素挪到右边)
多旋:1.先左旋后右旋 2.先右旋在左旋
SB Tree
这个其实不是非常熟悉,程序是计蒜客的,大概理解吧,做点笔记,不过注释都是自己的理解
1.定义
他也是平衡树的一种。每个结点所在子树的结点个数不小于其兄弟的两个孩子所在子树的结点个数。
还有SBTree 只有在插入时才可能触发调整。
据说他有个可以查找第k小的元素这个特殊的特点,为什么会有这个特点呢。
首先说个概念: 树的大小:所含结点的个数, 还有的话SB Tree也是属于排序树
SB Tree的结点的数据结构中用size储存了以当前结点为根构成的树的大小,那么它的父亲就排在size+1位了,具体看代码更好理解
2.实现
下面没注释的函数请看这个(二叉排序树):
http://blog.csdn.net/u012763794/article/details/50967631
#include <iostream>
using namespace std;
class SBTNode {
public:
//size:子树大小(就是以当前结点为根构成的树有多少结点)
//data:权值,就是树上的结点储存的值
//value:应该是临时储存权值的
int data, size, value;
SBTNode *