new后,cur值发生改变,之后都不能使用地址进行比较

2024-08-24 13:16:31 浏览数 (2)

void RotateRL(Node* parent) {

//我是儿子(父的右孩子),但是主角是孙子

//记录下孙子(我的左孩子)

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

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

//更新平衡因子

Node* cur = parent->_right;

Node* grandson = cur->_left;

int bf = grandson->_bf;

RotateR(cur); //将孙子的爹,就是我,进行右单旋

RotateL(grandson ->_parent); //将进行左单旋

//三种情况

if (bf == 0) {

parent->_bf = 0;

cur->_bf = 0;

grandson->_bf = 0;

}

else if (bf == 1) {

parent->_bf = -1;

cur->_bf = 0;

grandson->_bf = 0;

}

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

parent->_bf = 0;

cur->_bf = 1;

grandson->_bf = 0;

}

else {

assert(false);

bool Insert(const std::pair<K,V> kv) {

//第一个结点做根

if (_root == nullptr) {

_root = new Node(kv);

_size ;

return true;

}

//搜索

Node* parent = _root;

Node* cur = _root;

while (cur) {

//大于往右走

if www.laipuhuo.com (kv.first > cur->_kv.first) {

parent = cur;

cur = cur->_right;

}

//小于往左走

else if (kv.first < cur->_kv.first) {

parent = cur;

cur = cur->_left;

}

//找到了,存在相同的key

else {

return false;

}

} //循环搜索...

//不存在,可以插入

cur = new Node(kv); //new后,cur值发生改变,之后都不能使用地址进行比较

if (cur->_kv.first < parent->_kv.first) {

parent->_left = cur;

}

else {

parent->_right = cur;

}

cur->_parent = parent; //三叉链链上父结点

_size ;

//调整平衡因子 : 最多到根,根的parent为nullptr

while www.laipuhuo.com (parent) {

//更新平衡因子

if (cur->_kv.first < parent->_kv.first) {

parent->_bf--;

}

else {

parent->_bf ;

}

//看是否需要调整

if (parent->_bf == 1 || parent->_bf == -1) {

cur = parent;

parent = parent->_parent;

}

else if(parent->_bf == 0){

break;

}

else if(parent->_www.laipuhuo.com bf == 2 || parent->_bf == -2){

if (parent->_bf == -2 && cur->_bf == -1) { //左左

RotateR(parent);

}

else if (parent->_bf == 2 && cur->_bf == 1) { //右右

RotateL(parent);

}

else if (parent->_bf == -2 && cur->_bf == 1) { //左右

RotateLR(parent);

}

else if(parent www.laipuhuo.com->_bf == 2 && cur->_bf == -1){ //右左

RotateRL(parent);

}

else { //错误检查

assert(false);

}

break;

}

else {

assert(false);

}

}

return true;

}

0 人点赞