二叉搜索树
一、AVL 平衡搜索树
二叉搜索树虽可以缩短查找的效率,但如果数据极端,退化为链表,搜索时间复杂度为O(N),所以引入了ALV树,在二叉搜索树的基础加入平衡因子
平衡因子:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1
1、节点定义
template<class T>
struct AVLTreeNode{
AVLTreeNode(const T& data)
: _pLeft(nullptr)
, _pRight(nullptr)
, _pParent(nullptr)
, _data(data)
, _bf(0)//平衡因子,初始值为0,默认已经平衡
{
}
AVLTreeNode<T>* _pLeft; // 该节点的左孩子
AVLTreeNode<T>* _pRight; // 该节点的右孩子
AVLTreeNode<T>* _pParent; // 该节点的双亲
T _data;
int _bf; // 该节点的平衡因子
};
2、AVL 树旋转分类
2.1. 右单旋
45节点 的存在与否都不重要,如果40 没有右子树,那么它依然要进行单旋。上面的案列 50 没有双亲节点,如果有父节点,那该怎么调整呢?
就拿上列来说,我们假设 50 还有双亲节点
void RotateRight1(Node* pParent){
// pParent 代表的是 50 节点
// pSubL: pParent的左孩子 40
// pSubLR: pParent左孩子的右孩子