当前位置: 首页 > news >正文

哈尔滨高端模板建站网页设计模板素材图片中文

哈尔滨高端模板建站,网页设计模板素材图片中文,网站的前端和后端,英语不行如何编程做网站目录 前言 一#xff0c;概念 二#xff0c;定义 三#xff0c;insert 1. 插入情况 情况一#xff1a; 情况二#xff1a; 情况三#xff1a; 2. 旋转方法 法一#xff1a;左单旋法 法二#xff1a;右单旋法 法三#xff1a;先左后右双旋法 法四#xf… 目录 前言 一概念 二定义 三insert 1. 插入情况 情况一 情况二 情况三 2. 旋转方法 法一左单旋法 法二右单旋法 法三先左后右双旋法 法四先右后左双旋法 测试判断一棵树是否是AVL树 代码如下 3. 随机值案例 四删除 前言 map,set这两个容器有个共同点是 其底层都是按照二叉搜索树来实现的但是二叉搜索树有其自身的缺陷假如往树中插入的元素有序或者接近有序二叉搜索树就会退化成单支树时间复杂度会退化成O(N)因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理即采用平衡树来实现。 搜索二叉树请查看本篇博文【C】搜索二叉树底层实现_花果山~程序猿的博客-CSDN博客 一概念 二叉搜索树虽可以缩短查找的效率但 如果数据有序或接近有序二叉搜索树将退化为单支树查找元素相当于在顺序表中搜索元素效率低下。因此两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一种解决上述问题的方法 当向二叉搜索树中插入新结点后如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整)即可降低树的高度从而减少平均搜索长度。 一棵AVL树或者是空树或者是具有以下性质的二叉搜索树 1. 它的左右子树都是AVL树 2. 左右子树高度之差(简称平衡因子)的绝对值不超过 1  (-1/0/1) AVL树不一定用平衡因子进行实现 如果一棵二叉搜索树是高度平衡的它就是AVL树。如果它有n个结点其高度可保持在 O(log_2 n)搜索时间复杂度O(log_2 n)。 二定义 为方便循序渐进的学习这里只放最出初始的树结点定义。 template class K, class V class AVL_Data { public:pairK, V _kv;AVL_DataK, V* left nullptr;AVL_DataK, V* right nullptr;AVL_DataK, V* parent nullptr;int _bf 0; // ballance factorAVL_Data(const pairK, V p):_kv(p){}};上面定义在后面会进行完善修改。 三insert 根据前面搜索二叉树的经验我们能快速写完插入函数但AVL树是特殊的搜索二叉树我们需要对树的高度进行调整。那么我们插入时就会遇到三种情况 1. 插入情况 情况一 情况二 情况三 代码实现如下 template class K, class V class AVL_Tree {typedef AVL_DataK, V AVL_Data;AVL_Data* root nullptr;public:bool insert(const pairK, V p){AVL_Data* new_a_d new AVL_Data(p);if (!root){root new_a_d;}else{AVL_Data* cur root;AVL_Data* parent nullptr;while (cur){if (p.first cur-_kv.first){parent cur;cur cur-left;}else if (p.first cur-_kv.first){parent cur;cur cur-right;}else{delete(new_a_d); // 插入失败删除新建结点return false;}}if (p.first parent-_kv.first){parent-left new_a_d;}else{parent-right new_a_d;}new_a_d-parent parent;cur new_a_d;//完成插入进行平衡while (parent){ // 插入修改parent平衡因子if (cur parent-right){parent-_bf;}else{parent-_bf--;}// 判断parent平衡因子是否是0如果非0则需要向祖先更新平衡因子if (parent-_bf 1 || parent-_bf -1){cur parent;parent parent-parent;}else if (parent-_bf 0){break;}else if(parent-_bf 2 || parent-_bf -2){ // 处理绝对值大于1,下面代码目的是记录未修改的平衡因子。// 需要旋转处理这个我们下面再讲cur parent;parent parent-parent;}else{// 出现其他情况在插入时这棵AVL树本身就是异常AVL树assert(false);}}return true;}} }; 2. 旋转方法 法一左单旋法 我们以下面图为讲解例子a,b,c表示的是子树。 h 表示子树的高度。 请看下面场景: h 3, 4...组合方式会更多这里画出图没什么意义问题是失去平衡我们如何解决  通过下面方法解决 总结 1. 右边高则向左旋转。 2. C树发生插入平衡因子发生改变进而发生旋转。 void RotateL(AVL_Data* parent){assert(parent-right);AVL_Data* par parent;AVL_Data* par_R par-right;AVL_Data* par_RL par-right-left;AVL_Data* ppnode par-parent;par-right par_RL;if (par_RL)par_RL-parent par;par_R-left par;par-parent par_R;par_R-parent ppnode;if (!ppnode){root par_R;}else if (ppnode-left par){ppnode-left par_R;}else{ppnode-right par_R;}par-_bf 0;par_R-_bf 0;}// 实验例子AVL_Treeint, string tree;tree.insert(make_pair(30 , 李四));tree.insert(make_pair(20, 二麻子));tree.insert(make_pair(60, 张三));tree.insert(make_pair(45, 王五));tree.insert(make_pair(75, 王五));tree.insert(make_pair(65, 王五));法二右单旋法 思路跟左旋法差不多图像是相反这里就只给场景解法模板 h 0, 1, 2的发生场景 学会了法一自然会了法二 void RotateR(AVL_Data* parent){assert(parent-left);AVL_Data* par parent;AVL_Data* par_L par-left;AVL_Data* par_LR par-left-right;AVL_Data* ppnode par-parent;par-left par_LR;if (par_LR)par_LR-parent par;par_L-right par;par-parent par_L;par_L-parent ppnode;if (!ppnode){root par_L;}else if (ppnode-left par){ppnode-left par_L;}else{ppnode-right par_L;}par-_bf 0;par_L-_bf 0;} 法三先左后右双旋法 跟单旋一样我们首先展示当h 012时需要左右双旋处理的场景。 双旋法步骤变化流程如下 从结果来看就是将60这个位置推上去置于“根”。 代码如下 void RotateLR(AVL_Data* parent){assert(parent-left);AVL_Data* par parent;AVL_Data* par_L par-left;AVL_Data* par_LR par-left-right;AVL_Data* ppnode par-parent;int par_LR_bf par_LR-_bf;RotateL(par_L);RotateR(par);if (par_LR_bf -1){par-_bf 1;par_L-_bf 0;}else if (par_LR_bf 1){par-_bf 0;par_L-_bf -1;}else if (par_LR_bf 0){par-_bf 0;par_L-_bf 0;}else{assert(false);}par_LR-_bf 0;}// 测试案例 void Test_insert_L() {AVL_Treeint, string tree;tree.insert(make_pair(90, 李四));tree.insert(make_pair(30, 二麻子));tree.insert(make_pair(100, 张三));tree.insert(make_pair(25, 王五));tree.insert(make_pair(60, 王五));tree.insert(make_pair(50, 王五)); } 法四先右后左双旋法 我们学会法三后照葫芦画瓢即可。 各场景  代码 void RotateRL(AVL_Data* parent){assert(parent-right);AVL_Data* par parent;AVL_Data* par_R par-right;AVL_Data* par_RL par-right-left;AVL_Data* ppnode par-parent;int par_RL_bf par_RL-_bf;RotateR(par_R);RotateL(par);if (par_RL_bf -1){par-_bf 0;par_R-_bf 1;}else if (par_RL_bf 1){par-_bf -1;par_R-_bf 0;}else if (par_RL_bf 0){par-_bf 0;par_R-_bf 0;}else{assert(false);}par_RL-_bf 0;}// 测试案例 void Test_insert_L() {AVL_Treeint, string tree;tree.insert(make_pair(30, 李四));tree.insert(make_pair(20, 二麻子));tree.insert(make_pair(90, 张三));tree.insert(make_pair(15, 王五));tree.insert(make_pair(60, 王五));tree.insert(make_pair(100, 王五));tree.insert(make_pair(55, 王五));tree.insert(make_pair(67, 王五));tree.insert(make_pair(95, 王五));tree.insert(make_pair(50, 王五)); } 测试判断一棵树是否是AVL树 思路 1.  检查高度AVL中每棵子树都是AVL树。 2.  检查平衡因子是否正确。 代码如下 int Hight(const AVL_Data* root){if (root nullptr)return 0;int left_H Hight(root-left);int left_R Hight(root-right);return left_H left_R ? left_H 1 : left_R 1;}bool B_balance(){return _B_balance(root);}bool _B_balance(const AVL_Data* root){if (root nullptr)return true;int left_root Hight(root-left);int right_root Hight(root-right);if ((right_root - left_root) ! root-_bf) // 利用Hight进行平衡因子判断return false; return abs(left_root - right_root) 2 _B_balance(root-left) _B_balance(root-right);} 3. 随机值案例 用这个代码多跑几次差不多能遍历所有环境。 void Random_Test() {srand(time(0));const size_t N 10000000;AVL_Treeint, int t;for (size_t i 0; i N; i){size_t x rand();t.insert(make_pair(x, x));}cout t.B_balance() endl; } 快来测试自己的代码吧 insert全代码 bool insert(const pairK, V p){AVL_Data* new_a_d new AVL_Data(p);if (!root){root new_a_d;}else{AVL_Data* cur root;AVL_Data* parent nullptr;while (cur){if (p.first cur-_kv.first){parent cur;cur cur-left;}else if (p.first cur-_kv.first){parent cur;cur cur-right;}else{delete(new_a_d); // 插入失败删除新建结点return false;}}if (p.first parent-_kv.first){parent-left new_a_d;}else{parent-right new_a_d;}new_a_d-parent parent;cur new_a_d;//完成插入进行平衡while (parent){ // 插入修改parent平衡因子if (cur parent-right){parent-_bf;}else{parent-_bf--;}// 判断parent平衡因子是否是0如果非0则需要向祖先更新平衡因子if (parent-_bf 1 || parent-_bf -1){cur parent;parent parent-parent; }else if (parent-_bf 0){break;}else if (parent-_bf -2 || parent-_bf 2){if (parent-_bf 2 cur-_bf 1){RotateL(parent);// cout RotateL endl;}else if (parent-_bf -2 cur-_bf -1){RotateR(parent);// cout RotateR endl;}else if (parent-_bf -2 cur-_bf 1){RotateLR(parent);// cout RotateLR endl;}else if (parent-_bf 2 cur-_bf -1){RotateRL(parent);// cout RotateRL endl;}else{// 出现其他情况在插入时这棵AVL树本身就是异常AVL树// 问题出现在旋转方法assert(false);}break;}else{assert(false);}}return true;}} 四删除 因为AVL树也是二叉搜索树可按照二叉搜索树的方式将节点删除然后再更新平衡因子只不 错与删除不同的时删除节点后的平衡因子更新最差情况下一直要调整到根节点的位置。 具体实现学生们可参考《算法导论》或《数据结构-用面向对象方法与C描述》殷人昆版。 下期预告 红黑树 结语 本小节就到这里了感谢小伙伴的浏览如果有什么建议欢迎在评论区评论如果给小伙伴带来一些收获请留下你的小赞你的点赞和关注将会成为博主创作的动力。
http://www.w-s-a.com/news/138095/

相关文章:

  • 网站建设完成报告织梦网站怎么做备份
  • 邯郸市城乡建设管理局网站vimwiki wordpress
  • 如何修改wordpress站名如何制作公司网站
  • 宁波网站建设与推广方案网站有了备案号之后能做什么
  • 汕头手机端建站模板pinterest app下载
  • 网站主机免费宁波网站建设优化诊断
  • 吧网站做软件的软件下载简单的ui界面制作
  • 陕西网站制作公司网页制作与设计代码
  • 做网站行情郑州微信网站开发
  • 河间网站建设制作null wordpress theme
  • h5网站制作网站开发网站建设文翻译工作
  • 网站建设 税种秦皇岛哪有网站优化公司
  • 专业开发网站设计找人做网页需要多少钱
  • 手机购物网站 建站网站建设网站制作网站设计
  • 基于iview的网站开发模板小程序制作需要什么语言
  • 精美网站设计保定建行网站首页登录
  • 网站建设常见问题做网站保存什么格式最好
  • 营销型网站建设与网页设计网站建设 amp 找VX cp5173
  • 新网站该如何做网站优化呢儿童手工
  • 湖北现代城市建设集团网站搜索引擎优化的作用
  • 上海做网站吧开一家软件开发公司需要什么
  • 阿里巴巴网站建设改图片建设厅官方网站河南
  • 邓砚谷电子商务网站建设镇江网
  • 网站空间支持什么程序工作服款式
  • 网站单页品牌网站建设 蝌蚪5小
  • 怎么做外贸网站需注意哪些做电脑系统的网站
  • 网站建设介绍推广用语河南网站优化外包服务
  • 课程网站模板贵州省城乡与建设厅网站
  • 网站模板及源码谁家网站用户体验做的好
  • 做网站的技术要求搜索栏在wordpress菜单上位置