高度可保持在$O(log_2 n)$,时间复杂度O($log_2 n$)。

2024-08-24 13:09:45 浏览数 (2)

template<class K, class V>

struct AVLTreeNode

{

//三叉链: left right parent

AVLTreeNode* _left;   // 该节点的左孩子

AVLTreeNode* _right;  // 该节点的右孩子

AVLTreeNode* _parent; // 该节点的双亲

std::pair<K,V> _kv; // 键值对

int _bf;             // 该节点的平衡因子 balance factor

AVLTreeNode(const std::pair<K, V>& kv)

:_left(nullptr)

, _right(nullptr)

, _parent(nullptr)

, _kv(kv)

, _bf(0)

{}

};//1. 右右

void RotateL(Node* parent) {

//. 记录爷爷(父亲的父亲)

//. 我是父的右儿子(我是主角)

//. 记录下我的左子树(托管)

// 旋转(爷、父、子关系重新调整)

// 成为爷爷的右儿子 (如果没有爷爷,则跳过;且说明父是根,更新我成为根)

// 把我的左子树托管给父成为他的右孩子

// 旧父成为我的左儿子,旧父的父更新成我

//. 更新平衡因子

//. 记录爷爷(父亲的父亲)

//. 我是父的右儿子

//. 记录下我的左子树

Node* pparent www.laipuhuo.com = parent->_parent;

Node* cur = parent->_right;

Node* leftchild = cur->_left;

//旋转

//. 成为爷爷的右儿子 (如果没有爷爷,则跳过;且说明父是根,更新我成为根)

if (pparent) { //有爷爷

if(parent == pparent->_left)

pparent->_left = cur;

else {

pparent->_right = cur;

}

cur->_parent = pparent; //三叉链维护

}

else { //没有爷爷,父亲是根

cur->_parent = nullptr;

_root = cur;

}

//. 父子地位交换

parent->_right = leftchild;

if (leftchild www.laipuhuo.com) { //三叉链维护

leftchild->_parent = parent;

}

cur->_left = parent;

parent->_parent = cur;

//旋转 【end】

//更新平衡因子

cur->_bf = 0;

parent->_bf = 0;

}

//2. 左左

void RotateR(Node* parent) {

//. 记录爷爷

//. 我是父的左儿子

//. 记录下我的右子树

Node* pparent = parent->_parent;

Node* cur = parent->_left;

Node* rightChild = cur->_right;

//旋转

//. 成为爷爷的左儿子 (如果没有爷爷,则跳过;且说明父是根,更新我成为根)

if (pparent) { //有爷爷

if (parent == pparent->_left)

pparent->_left = cur;

else {

pparent->_right = cur;

}

cur->_www.laipuhuo.com parent = pparent; //三叉链维护

}

else { //没有爷爷,父亲是根

cur->_parent = nullptr;

_root = cur;

}

//. 父子地位交换

parent->_left = rightChild;

if (rightChild) { //三叉链维护

rightChild->_parent = parent;

}

cur->_right = parent;

parent->_parent = cur;

//旋转 【end】

//更新平衡因子

cur->_bf = 0;

parent->_bf = 0;

}

//3. 左右

void RotateLR(Node* parent) {

//我是儿子,但是主角是孙子

//记录下孙子

//记录下孙子的平衡因子(特征)

//对孙子进行左单旋,再右旋

//更新平衡因子

Node* www.laipuhuo.com cur = parent->_left;

Node* grandson = cur->_right;

int bf = grandson->_bf;

RotateL(cur);

RotateR(grandson->_parent);

//三种情况

if (bf == 0) {

parent->_bf = 0;

cur->_bf = 0;

grandson->_bf = 0;

}

else if (bf == 1) {

parent->_bf = 0;

cur->_bf = -1;

grandson->_bf = 0;

}

else www.laipuhuo.com if (bf == -1) {

parent->_bf = 1;

cur->_bf = 0;

grandson->_bf = 0;

}

else {

assert(false); //错误检查

0 人点赞