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

织梦后台点击网站主页湖南常德市简介

织梦后台点击网站主页,湖南常德市简介,厦门做网站维护的公司,站点和网站的区别【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍#xff08;百度百科#xff09;AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者#xff1a;爱写代码的刚子 时间#xff1a;2023.9.10 前言#xff1a;本篇博客将…【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍百度百科AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者爱写代码的刚子 时间2023.9.10 前言本篇博客将会介绍AVL树的模拟实现(模拟AVL树的插入)以及如何去验证是否为AVL树 AVL树的介绍百度百科 AVL树本质上还是一棵二叉搜索树它的特点是 本身首先是一棵二叉搜索树。 带有平衡条件每个结点的左右子树的高度之差的绝对值平衡因子最多为1。 也就是说AVL树本质上是带了平衡功能的二叉查找树二叉排序树二叉搜索树。 AVL树insert函数的实现代码 templateclass K,class V class AVLTreeNode { public:AVLTreeNode(const pairK,V kv):_left(nullptr),_right(nullptr),_parent(nullptr),_kv(kv),_bf(0){}AVLTreeNode* _left;AVLTreeNode* _right;AVLTreeNode* _parent;//需要设立父节点指针pairK,V _kv;int _bf; };templateclass K,class V class AVLTree {typedef AVLTreeNodeK,V Node; public:AVLTree():_root(nullptr){}bool insert(const pairK,V kv){if(_rootnullptr){_rootnew Node(kv);return true;}else{Node* cur_root;Node* parentnullptr;//设计parent指针是必要的while(cur){if(cur-_kv.firstkv.first){parentcur;curcur-_left;}else if(cur-_kv.firstkv.first){parentcur;curcur-_right;}else{return false;}}curnew Node(kv);//判断新加入的节点是父节点的左子树还是右子树if(parent-_kv.firstkv.first){parent-_leftcur;}else{parent-_rightcur;}cur-_parentparent;while(parent){//及时调整父节点的平衡因子if(parent-_leftcur){--parent-_bf;}else{parent-_bf;}if(parent-_bf0)//当父节点的平衡因子为0时停止调整{break;}else if(parent-_bf-1||parent-_bf1){curparent;parentparent-_parent;}else if(parent-_bf2||parent-_bf-2)//处理异常情况{//出现问题的情况if(parent-_bf-2cur-_bf-1){_RotateR(parent);//右单旋}else if(parent-_bf2cur-_bf1){_RotateL(parent);//左单旋}else if(parent-_bf-2cur-_bf1){ _RotateLR(parent);//左右双旋}else if(parent-_bf2cur-_bf-1){_RotateRL(parent);//右左双旋}else{assert(false);}break;}else{assert(false);}}}return true;} void _RotateR(Node* parent)//右单旋的实现{Node*curparent-_left;Node*curRightcur-_right;Node*ppnodeparent-_parent;cur-_rightparent;parent-_leftcurRight;if(curRight)//curRight可能是nullptr{curRight-_parentparent;}parent-_parentcur;//处理ppnodeif(parent_root)//parent为头节点时需要单独处理{_rootcur;cur-_parentnullptr;}else{if(ppnode-_leftparent){ppnode-_leftcur;}else{ppnode-_rightcur;}cur-_parentppnode;}parent-_bfcur-_bf0;}void _RotateL(Node* parent){Node* curparent-_right;Node* curLeftcur-_left;Node* ppnodeparent-_parent;cur-_leftparent;parent-_rightcurLeft;if(curLeft){curLeft-_parentcur;}parent-_parentcur;if(parent_root){_rootcur;cur-_parentnullptr;}else{if(ppnode-_leftparent){ppnode-_leftcur;}else{ppnode-_rightcur;}cur-_parentppnode;}parent-_bfcur-_bf0;}void _RotateLR(Node* parent){Node* curparent-_left;Node* curRightcur-_right;int bfcurRight-_bf;_RotateL(cur);_RotateR(parent);//最好再处理一下平衡因子减少耦合度if(bf0)//单链情况下{parent-_bf0;cur-_bf0;curRight-_bf0;}else if(bf-1){parent-_bf1;curRight-_bf0;cur-_bf0;}else if(bf1){parent-_bf-1;curRight-_bf0;cur-_bf0;}else{assert(false);}}void _RotateRL(Node* parent){Node* curparent-_right;Node* curLeftcur-_left;int bfcurLeft-_bf;_RotateR(cur);_RotateL(parent);if(bf0){parent-_bf0;curLeft-_bf0;cur-_bf0;}else if(bf1){parent-_bf0;curLeft-_bf-1;cur-_bf0;}else if(bf-1){parent-_bf0;curLeft-_bf1;cur-_bf0;}else{assert(false);}}private:Node* _root; }; 验证是否为AVL树 int _Height(Node* root){if(rootnullptr){return 0;}int leftHeight_Height(root-_left);int rightHeight_Height(root-_right);return leftHeightrightHeight?leftHeight1:rightHeight1;}bool _Isbalance(){return _Isbalance(_root);}bool _Isbalance(Node* root){if(rootnullptr){return true;}int right_Height(root-_right);int left_Height(root-_left);if(root-_bf!right-left){cout平衡因子异常root-_bf right leftendl;return false;}return abs(right-left)2_Isbalance(root-_left)_Isbalance(root-_right);}根据AVL树的特性引入两个成员函数_Height函数用于计算二叉树的高度 以下为验证结果 AVL树模拟实现的要点 易忘点 一定要时刻注意_parent指针的修改尤其旋转函数中需要判断旋转后的二叉树的根节点是否还有父亲节点如果有需要在旋转前先保存之后再链接上。 AVL树的旋转思路 新增在左parent平衡因子减减新增在右parent平衡因子加加更新后parent平衡因子 0说明parent所在的子树的高度不变不会再影响祖先不用再继续沿着到eot的路径往上更新更新后parent平衡因子 1 0r -1说明parent所在的子树的高度变化会再影响祖先需要继续沿着到root的路径往上更新更新后更新后parent平衡因子 2 or -2说明parent所在的子树的高度变化且不平衡对parent所在子树进行旋转让他平衡更到根节点插入结束 由于AVL树画图较为麻烦作者先不画了可以看看其他大佬的博客一些需要注意的地方已经写在代码注释里了AVL树的删除之后有机会可以模拟实现一下。 AVL树的调试较为麻烦模拟实现可以提高自己的调试能力。
http://www.zqtcl.cn/news/335799/

相关文章:

  • 路由器做内部网站服务器石家庄新闻综合频道在线直播回放
  • 怎么给网站备案亚马逊网站建设与维护方法分析
  • 金华网站建设团队产品网络推广方案范文
  • 拼多多刷单网站开发虚拟机可以做两个网站
  • wordpress安装路径和站点地址的设置信通网站开发中心
  • 柳州公司网站建设网站服务商
  • 智能建站实验报告成功营销网站
  • 基于jsp的网站开发开题报告青海公路工程建设市场信用信息服务网站
  • 做网站页面的软件wordpress如何开启page页面评论
  • 做网站最简单的长春财经学院
  • 导购网站 icp备案要求网站设置ico
  • ftp做网站营销策划方案步骤
  • 网站建设若干意见wordpress查看数据库密码
  • 什么网站可以做宣传西安网站建设聚星互联
  • 产品展示网站源码2015年做哪些网站致富
  • 潍坊网站制作推广怎样做彩票网站
  • 做视频网站被判刑自己怎么做企业网站建设
  • 安庆网站建设兼职哪个公司的卡网络最好
  • tp框架做响应式网站青岛网站建设首选
  • 外国自适应企业网站做网站模板用什么框架
  • win7做网站服务器隐私浏览器
  • 优秀的设计网站广州排名推广
  • 做电商设计有什么好的网站推荐软件产品开发流程图
  • 建设网站请示宣传企业网站建设的
  • 汉中定制网站建设公司网站建设建站知识
  • 做壁纸网站建站优化办事效率高
  • linux 做网站数据库怎么开发ios软件
  • 沛县网站设计html制作网页的代码
  • 南昌网站建设公司如何万维网络(临沂网站建设)
  • 张家界做网站洛阳网站建设哪家专业