赞
踩
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
此时:pParent的平衡因子可能有三种情况:0,正负1, 正负2
pair<Node\*,bool> Insert(const pair<K, V>& kv) { if (_root == nullptr)//根节点为空时先new一个新节点 { _root = new Node(kv); return make\_pair(_root, true); } Node\* cur = _root; Node\* parent = nullptr; //先利用while循环去找cur的空位 while (cur) { if (kv.first > cur->_kv.first) { parent = cur; cur = cur->_right; } else if (kv.first < cur->_kv.first) { parent = cur; cur = cur->_left; } else { return make\_pair(cur, false); } } //将cur插入到相应位置 cur = new Node(kv); Node\* newnode = cur;//用一个newnode记录一下新节点用以返回 if (kv.first > parent->_kv.first) { parent->_right = cur;//注意三叉链的链接逻辑顺序,等号左右方向不能反,先把cur链接到父节点的右边 cur->_parent = parent;//然后再去把父指针知道父节点 } else { parent->_left = cur; cur->_parent = parent; } //进行旋转调整 //while(cur!=\_root) while (parent) { //1.进入循环先对平衡因子进行调整 if (cur == parent->_right) { parent->_bf++; } else { parent->_bf--; } //分三种情况向上走 if (parent->_bf == 0)//平衡因子等于0不需要调整 { //为什么不需调整 //因为等于0的话,说明底层子树高度不平衡,添加进入新元素后平衡了,只要平衡了高度并没发生变化,不会影响上面的父节点 break; } else if (parent->_bf == -1 || parent->_bf == 1) { //平衡因子等于-1,说明插入新节点后子树的高度不平衡了,需要继续往上迭代查看父节点是否还满足平衡节点 cur = parent; parent = parent->_parent; } else if (parent->_bf == 2 || parent->_bf == -2) { if (parent->_bf == -2)//父节点等于-2,说明左边高,触发右旋的情况 { if (cur->_bf == -1)//cur节点等于-1,说明在cur的左边更高,触发右单旋的情况 { RotateR(parent); } else//cur等于-1,说明在cur的右边更高,触发左右双旋 { RotateLR(parent); } } else//父节点等于1,说明右边更高,触发左旋的情况 { if (cur->_bf == 1)//cur节点等于1时,说明在cur的右边更高,触发右单旋的情况 { RotateL(parent); } else//cur等于-1,说明在cur的左边更高,触发右左双旋 { RotateRL(parent); } } //思考:为什么上面在传参数的时候,都是传parent的节点呢?这样的好处是什么呢 break;//调整完成后break退出循环 //这里为什么调整完成过后就可以退出,通过旋转调整平衡因子后,parent节点的平衡因子都为0了,调整过后不需要再向上继续查找了 } else { assert(false); } } return make\_pair(newnode,true); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。