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

汉中建网站美橙互联 wordpress

汉中建网站,美橙互联 wordpress,北京网站建设加q.479185700,十款免费软件app下载文章目录 AVL树AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋 代码实现 总结 AVL树 AVL树的概念 二叉搜索树在顺序有序或接近有序的情况下#xff0c;而插入搜索树将退化为单叉树#xff0c;此时查找的时间复杂度为O(n)#xff0c;效率低… 文章目录 AVL树AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋 代码实现 总结 AVL树 AVL树的概念 二叉搜索树在顺序有序或接近有序的情况下而插入搜索树将退化为单叉树此时查找的时间复杂度为O(n)效率低下。 两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法当向二叉搜索树中插入新节点后保证每个节点的左右子树高度差的绝对值不超过1即可降低树的高度减少平均搜索长度。因此AVL树也被叫做高度平衡二叉搜索树插入查找删除在平均和最坏情况下的时间复杂度都是O( l o g 2 n log_2 n log2​n)。 AVL树节点的定义 templateclass K, class Vstruct AVLTreeNode{AVLTreeNodeK, V* _left;AVLTreeNodeK, V* _right;AVLTreeNodeK, V* _parent;pairK, V _kv;int _bf; //balance factor 平衡因子AVLTreeNode(const pairK, V kv):_left(nullptr),_right(nullptr),_parent(nullptr),_kv(kv),_bf(0){}};注意实现AVL树平衡因子不是必须的只不过有了平衡因子帮助我们更便捷地控制整棵树。 AVL树的插入 根据二叉搜索树的规则插入新节点 bool Insert(const pairK, V kv){root为空特殊处理if (_root nullptr){_root new Node(kv);return true;}Node* curr _root;Node* parent nullptr;while (curr){if (curr-_kv.first kv.first){parent curr;curr curr-_right;}else if (curr-_kv.first kv.first){parent curr;curr curr-_left;}else{return false;}}将新节点和其父亲节点链接起来Node* newnode new Node(kv);if (parent-_kv.first kv.first)parent-_right newnode;elseparent-_left newnode;newnode-_parent parent;......}不断向上更新平衡因子 当前平衡因子为0说明插入之前平衡因子为1 / -1插入之后不改变树的高度不会影响其他祖先节点此时更新结束。当前平衡因子为1 / -1说明插入之前平衡因子为0插入之后当前节点地高度发生变化会影响其他祖先节点但是不违反规则需要向上对祖先节点进行更新直至当前节点为root。当前平衡因子为 2 / -2此时当前节点所在地子树违反了平衡规则需要进行处理–旋转。 while (parent) {if (parent-_left newnode){parent-_bf--;}else{parent-_bf;}if (parent-_bf 0)break;else if (parent-_bf -1 || parent-_bf 1){newnode parent;parent parent-_parent;}else if (parent-_bf -2 || parent-_bf 2){旋转处理}else{assert(false);} }AVL树的旋转 右单旋 void RotatoR(Node* parent) {Node* subL parent-_left;Node* subLR subL-_right;parent-_left subLR;if (subLR)subLR-_parent parent;subL-_right parent;Node* ppnode parent-_parent;parent-_parent subL;if (parent _root){_root subL;subL-_parent nullptr;}else{if (ppnode-_left parent)ppnode-_left subL;elseppnode-_right subL;subL-_parent ppnode;}parent-_bf 0;subL-_bf 0; }左单旋 void RotatoL(Node* parent) {Node* subR parent-_right;Node* subRL subR-_left;parent-_right subRL;if (subRL)subRL-_parent parent;subR-_left parent;Node* ppnode parent-_parent;parent-_parent subR;if (parent _root){_root subR;subR-_parent nullptr;}else{if (ppnode-_left parent)ppnode-_left subR;elseppnode-_right subR;subR-_parent ppnode;}parent-_bf 0;subR-_bf 0; }左右双旋 旋转之前45的平衡因子可能是-1/0/1旋转完成之后根据情况对其他节点的平衡因子进行调整 void RotatoLR(Node* parent) {Node* subL parent-_left;Node* subLR subL-_right;int bf subLR-_bf;RotatoL(subL);RotatoR(parent);subLR-_bf 0;if (bf 0){subL-_bf 0;parent-_bf 0;}else if (bf 1){subL-_bf -1;parent-_bf 0;}else if (bf -1){subL-_bf 0;parent-_bf 1;} }右左双旋 void RotatoRL(Node* parent) {Node* subR parent-_right;Node* subRL subR-_left;int bf subRL-_bf;subRL-_bf 0;RotatoR(subR);RotatoL(parent);if (bf 0){subR-_bf 0;parent-_bf 0;}else if (bf 1){subR-_bf 0;parent-_bf -1;}else if (bf -1){subR-_bf 1;parent-_bf 0;} }代码实现 namespace xxx {templateclass K, class Vstruct AVLTreeNode{AVLTreeNodeK, V* _left;AVLTreeNodeK, V* _right;AVLTreeNodeK, V* _parent;pairK, V _kv;int _bf; //balance factor 平衡因子AVLTreeNode(const pairK, V kv):_left(nullptr),_right(nullptr),_parent(nullptr),_kv(kv),_bf(0){}};templateclass K, class Vclass AVLTree{typedef AVLTreeNodeK, V Node;public:bool Insert(const pairK, V kv){if (_root nullptr){_root new Node(kv);return true;}Node* curr _root;Node* parent nullptr;while (curr){if (curr-_kv.first kv.first){parent curr;curr curr-_right;}else if (curr-_kv.first kv.first){parent curr;curr curr-_left;}else{return false;}}Node* newnode new Node(kv);if (parent-_kv.first kv.first)parent-_right newnode;elseparent-_left newnode;newnode-_parent parent;while (parent){if (parent-_left newnode){parent-_bf--;}else{parent-_bf;}if (parent-_bf 0)break;else if (parent-_bf -1 || parent-_bf 1){newnode parent;parent parent-_parent;}else if (parent-_bf -2 || parent-_bf 2){if (parent-_bf 2 newnode-_bf 1){RotatoL(parent);}else if (parent-_bf -2 newnode-_bf -1){RotatoR(parent);}else if (parent-_bf -2 newnode-_bf 1){RotatoLR(parent);}else if (parent-_bf 2 newnode-_bf -1){RotatoRL(parent);}else{assert(false);}break;}else{assert(false);}}return true;}void RotatoL(Node* parent){Node* subR parent-_right;Node* subRL subR-_left;parent-_right subRL;if (subRL)subRL-_parent parent;subR-_left parent;Node* ppnode parent-_parent;parent-_parent subR;if (parent _root){_root subR;subR-_parent nullptr;}else{if (ppnode-_left parent)ppnode-_left subR;elseppnode-_right subR;subR-_parent ppnode;}parent-_bf 0;subR-_bf 0;}void RotatoR(Node* parent){Node* subL parent-_left;Node* subLR subL-_right;parent-_left subLR;if (subLR)subLR-_parent parent;subL-_right parent;Node* ppnode parent-_parent;parent-_parent subL;if (parent _root){_root subL;subL-_parent nullptr;}else{if (ppnode-_left parent)ppnode-_left subL;elseppnode-_right subL;subL-_parent ppnode;}parent-_bf 0;subL-_bf 0;}void RotatoLR(Node* parent){Node* subL parent-_left;Node* subLR subL-_right;int bf subLR-_bf;RotatoL(subL);RotatoR(parent);subLR-_bf 0;if (bf 0){subL-_bf 0;parent-_bf 0;}else if (bf 1){subL-_bf -1;parent-_bf 0;}else if (bf -1){subL-_bf 0;parent-_bf 1;}}void RotatoRL(Node* parent){Node* subR parent-_right;Node* subRL subR-_left;int bf subRL-_bf;subRL-_bf 0;RotatoR(subR);RotatoL(parent);if (bf 0){subR-_bf 0;parent-_bf 0;}else if (bf 1){subR-_bf 0;parent-_bf -1;}else if (bf -1){subR-_bf 1;parent-_bf 0;}}void InOrder(){_InOrder(_root);cout endl;}bool IsAVLTree(){return _IsAVLTree(_root);}private:bool _IsAVLTree(Node* root){if (root nullptr)return true;int leftH Height(root-_left);int rightH Height(root-_right);return abs(leftH - rightH) 1 _IsAVLTree(root-_left) _IsAVLTree(root-_right);}int Height(Node* node){if (node nullptr)return 0;int leftH Height(node-_left);int rightH Height(node-_right);return 1 max(leftH, rightH);}void _InOrder(Node* root){if (root nullptr)return;_InOrder(root-_left);cout root-_kv.second ;_InOrder(root-_right);}Node* _root nullptr;}; }总结 AVL树是一棵绝对平衡的二叉搜索树其要求每个节点的左右子树高度差的绝对值都不超过1这样可以保证查询时高效的时间复杂度即 l o g 2 ( N ) log_2 (N) log2​(N)。但是如果要对AVL树做一些结构修改的操作性能非常低下比如插入时要维护其绝对平衡旋转的次数比较多。因此如果需要一种查询高效且有序的数据结构而且数据的个数为静态的(即不会改变)可以考虑AVL树但一个结构经常修改就不太适合。
http://www.w-s-a.com/news/891611/

相关文章:

  • 做网站开专票税钱是多少个点上海市有哪些公司
  • 寿县有做网站开发的吗宁波网站建设方式
  • 网站建设和网站推广服务器怎么发布网站
  • 比较好的摄影网站雅安市政建设公司网站
  • 网站与微信区别wordpress 站内信
  • 宁夏网站开发设计说明书源码下载脚本之家
  • 邱县做网站百度搜索排名机制
  • 运城个人网站建设智慧团建系统官方网站登录
  • 公司营业执照可以做几个网站一家专门做母婴的网站
  • 网站建设商标属于哪个类别搜狗seo快速排名公司
  • 织梦做商城网站企业网络建站
  • 网站后期维护都有什么wordpress首页加图片
  • 展会网站怎么做网页设计与制作教程版徐洪亮课后答案
  • 石景山网站建设设计公司建设网站怎么建立服务器
  • 本地生活服务平台app网站关键词优化原理
  • 建网站的公司叫什么重庆论坛建站模板
  • 湖北网站制作公司银川网站建设哪家不错
  • 网站后台演示地址服装网站建设公司推荐
  • 湖北钟祥建设局网站旅游哪个网站最好
  • 浙江建设工程信息网站辽宁建设工程信息网场内业绩什么意思
  • 郑州做网站公司 汉狮网络专业图片搜集网站怎么做
  • 网站托管是什么品牌推广营销平台
  • 制作网站的难度贵州省兴义市建设局网站
  • 永春建设局网站室内设计师培训班学费多少
  • 做仿站如何获取网站源码windows2012做网站
  • 网站建设最好的公司东莞外贸网站
  • 普兰店网站建设一般做网站什么价格
  • 网站建设的发展目标甘肃网站设计公司
  • 常州西站建设规划室内装修设计学校哪里好
  • 大连网站制作选择ls15227如何编辑网站