网站建设对企业的好处有哪些全方位营销型网站

news/2025/10/6 4:44:28/文章来源:
网站建设对企业的好处有哪些,全方位营销型网站,晋城推广型网站开发,wordpress用户排行榜目录 AVL树概念 AVL树结构 AVL树插入 LL型 - 右单旋 RR型 - 左单旋 LR型 - 左右双旋 RL型 - 右左双旋 插入代码实现 AVL树测试 附AVL树实现完整代码 AVL树概念 前面的博客介绍了搜索二叉树#xff0c;二叉搜索树-CSDN博客 在某些特定的情况下#xff0c;⼆叉搜索树…目录 AVL树概念 AVL树结构 AVL树插入 LL型 - 右单旋 RR型 - 左单旋 LR型 - 左右双旋 RL型 - 右左双旋 插入代码实现 AVL树测试 附AVL树实现完整代码 AVL树概念 前面的博客介绍了搜索二叉树二叉搜索树-CSDN博客 在某些特定的情况下⼆叉搜索树是会退化成单链表的并且各种操作的效率也会明显的下降因此我们需要⼀些特别的⼿段保证这个⼆叉搜索树的“平衡”进⽽保证各种操作的 效率。这就是我们接下来要学习的平衡⼆叉树 为了保证⼆叉搜索树的性能规定在插⼊和删除结点时要保证任意结点的左、⼦树⾼度差的绝对值不超过1 这样的⼆叉树称为平衡⼆叉树(简称AVL树)。 其中结点左⼦树与右⼦树的⾼度差定义为该结点的平衡因⼦(⼀般是左⼦树的⾼度减去右⼦树的⾼ 度。当然反过来也是可以的 由此可⻅平衡⼆叉树中每⼀个结点的平衡因⼦只可能是 0/1/-1如下图所⽰结点上⽅的数字表⽰平衡因⼦。左图是⼀棵平衡⼆叉树右图不是⼀棵平衡⼆叉树 AVL树结构 我们采用三叉链的结构实现节点因为AVL树调平衡的过程需要向上找父节点因此需要存储父节点的指针信息 templateclass K, class V struct AVLTreeNode {//三叉链AVLTreeNodeK, V* _left;AVLTreeNodeK, V* _right;AVLTreeNodeK, V* _parent;pairK, V _kv;int _bf; //平衡因子AVLTreeNode(const pairK, V kv):_left(nullptr), _right(nullptr), _parent(nullptr), _kv(kv), _bf(0){} };templateclass K, class V class AVLTree {typedef AVLTreeNodeK, V Node; private:Node* _root nullptr; }; AVL树插入 在⼆叉搜索树中插⼊新结点之后插⼊路径的点中可能存在很多平衡因⼦的绝对值⼤于1的此时找到距离插⼊结点最近的不平衡的点以这个点为根的字树就是不平衡子树。如下图: 插⼊之后会导致三个结点失衡其中距离最近的 结点为根的⼦树就是最小不平衡子树。可以发现仅需让最⼩不平衡⼦树平衡所有结点就都平衡了感性认知如下: 1. 本来整棵树就是平衡⼆叉树如果来了⼀个结点导致失衡那么失衡结点的平衡因⼦只能是2或者 -2 2 .当我们把最⼩平衡⼦树调整平衡之后那么这棵⼦树的⾼度就会减 向上传递的过程中会让 整个路径⾥⾯的平衡因⼦都向0靠近⼀位原来的-2会变成-1原来的2会变成1整棵树就变得平衡了。 而最⼩不平衡⼦树的出现可以细分成4种情况因此调整策略也会分为4种情况讨论。为了方便叙述 设最小不平衡子树的根节点为T。 LL型 - 右单旋 LL 表示新结点由于插⼊在T结点的左孩⼦(L)的左⼦树(LL)中从⽽导致失衡。如下图所示: 此时需要将L右旋 • 将结点L向右上旋转代替结点T作为根结点 • 将节点T向右下旋转作为结点L的右⼦树的根结点 • 结点L的原右⼦树(LR)则作为结点T的左⼦树 旋转之后依旧满⾜平衡⼆叉树的特性LL L LR T R 案例下列AVL树中插⼊1 最⼩不平衡⼦树是以 13 为根的⼦树引起不平衡的原因是 13的左孩⼦的左⼦树上插⼊⼀个新的结点因此需要右旋⼀次。右旋的结点为10 代码实现: void RotateR(Node *parent) {Node *subL parent-_left;Node *subLR subL-_right;parent-_left subLR;if (subLR)subLR-_parent parent;Node *parentParent parent-_parent;subL-_right parent;parent-_parent subL;if (_root parent){_root subL;subL-_parent nullptr;}else{if (parentParent-_left parent){parentParent-_left subL;}else{parentParent-_right subL;}subL-_parent parentParent;}subL-_bf parent-_bf 0; } RR型 - 左单旋 RR表⽰新结点由于插⼊在T结点的右孩⼦(R)的右⼦树(RR)中从⽽导致失衡。如下图所⽰ 此时需要⼀次向左的旋转操作将R左旋 • 将结点R向左上旋转代替结点T作为根结点 • 将节点T向左下旋转作为结点R的左⼦树的根结点 • 结点R的原左⼦树(RL)则作为结点T的右⼦树。 如下图 案例下列AVL树中插⼊64 最⼩不平衡⼦树是以 49 为根的⼦树引起不平衡的原因是 49 的右孩⼦的右⼦树上插⼊⼀个新的结 点因此需要左旋⼀次。左旋的结点为59 代码实现 void RotateL(Node *parent) {Node *subR parent-_right;Node *subRL subR-_left;parent-_right subRL;subR-_left parent;// 旋转之后整棵子树的根变了, 需要重新链接Node *parentParent parent-_parent;parent-_parent subR;if (subRL)subRL-_parent parent;if (_root parent){_root subR;subR-_parent nullptr;}else{if (parentParent-_left parent){parentParent-_left subR;}else{parentParent-_right subR;}subR-_parent parentParent;}parent-_bf subR-_bf 0; } LR型 - 左右双旋 LR表⽰新结点由于插⼊在T结点的左孩⼦(L)的右⼦树(LR)中从⽽导致失衡。如下图所⽰ 此时需要两次旋转操作先将LR左旋再将LR右旋。 将LR左旋 • 将结点LR向左上旋转代替结点L作为根结点 • 将节点L向左下旋转作为结点LR的左⼦树的根结点 • 结点LR的原左⼦树(LRL)则作为结点L的右⼦树。 将LR右旋 • 将结点LR向右上旋转代替结点T作为根结点 • 将节点T向右下旋转作为结点LR的右⼦树的根结点 • 结点LR的原右⼦树(LRR)则作为结点T的左⼦树。 案例下列AVL树中插⼊1 最⼩不平衡⼦树是以49为根的⼦树引起不平衡的原因是49的左孩⼦的右⼦树上插⼊⼀个新的结点因此需要左旋⼀次然后右旋⼀次。旋转的结点为45 void RotateLR(Node *parent) {Node *subL parent-_left;Node *subLR subL-_right;int bf subLR-_bf; // subLR不可能为nullptr因为subL的平衡因子是-1RotateL(subL);RotateR(parent);// 3、更新平衡因子if (bf 1){subLR-_bf 0;subL-_bf 0;parent-_bf -1;}else if (bf -1){subLR-_bf 0;subL-_bf 1;parent-_bf 0;}else if (bf 0){subLR-_bf subL-_bf parent-_bf 0;}else{assert(false); // 在旋转前树的平衡因子就有问题} } RL型 - 右左双旋 RL表⽰新结点由于插⼊在T结点的右孩⼦(R)的左⼦树(RL)中从⽽导致失衡。如下图所⽰ 此时需要两次旋转操作先将RL右旋再将RL左旋。将RL右旋 • 将结点RL向右上旋转代替结点R作为根结点 • 将节点R向右下旋转作为结点RL的右⼦树的根结点 • 结点RL的原右⼦树(RLR)则作为结点R的右⼦树。 将RL左旋 • 将结点RL向左上旋转代替结点T作为根结点 • 将节点T向左下旋转作为结点RL的左⼦树的根结点 • 结点RL的原左⼦树(RLL)则作为结点T的右⼦树。 案例下列AVL树中插⼊52 最⼩不平衡⼦树是以49为根的⼦树引起不平衡的原因是49的右孩⼦的左⼦树上插⼊⼀个新的结点因此需要右旋⼀次然后再左旋⼀次。旋转的结点为55 代码实现 void RotateRL(Node *parent) {Node *subR parent-_right;Node *subRL subR-_left;int bf subRL-_bf;RotateR(parent-_right);RotateL(parent);if (bf 0){parent-_bf subR-_bf subRL-_bf 0;}else if (bf -1){parent-_bf 1;subRL-_bf 0;subR-_bf 0;}else if (bf 1){parent-_bf 0;subRL-_bf 0;subR-_bf -1;}else{assert(false);} } 插入代码实现 bool Insert(const pairK, V kv) {if (_root nullptr){_root new Node(kv);return true;}Node *parent nullptr;Node *cur _root;while (cur){if (cur-_kv.first kv.first){parent cur;cur cur-_right;}else if (cur-_kv.first kv.first){parent cur;cur cur-_left;}else{return false;}}cur new Node(kv);if (parent-_kv.first kv.first){parent-_right cur;cur-_parent parent;}else{parent-_left cur;cur-_parent parent;}while (parent){// 平衡因子的变化if (cur parent-_left){parent-_bf;}else{parent-_bf--;}if (parent-_bf 0) // 之前为-1/1, cur填到了较低的一边树高不变不需要继续调整了!{break;}else if (parent-_bf 1 || parent-_bf -1) // 之前为0, 当前树高1, 可能不再平衡了,向上调整!{cur parent;parent parent-_parent;}else if (parent-_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-_bf -2 cur-_bf 1){RotateRL(parent);}// 1、旋转让这颗子树平衡了// 2、旋转降低了这颗子树的高度恢复到跟插入前一样的高度所以对上一层没有影响不用继续更新break;}else{assert(false);}}return true; } ● 首先和二叉搜索树一样先找到合适的插入位置再进行插入 ● 插入后更新当前子树的平衡因子然后根据平衡因子的特点执行不同的操作 ● 如果当前子树的平衡因子是0说明依旧平衡不需要调平衡如果当前子树的平衡因子是1/-1需要继续向上找最小不平衡子树如果当前子树的平衡因子是2/-2说明找到了最小不平衡子树根据平衡因子的特点执行不同的旋转操作只要最小不平衡子树调平衡了整棵树就平衡了直接跳出循环即可 AVL树测试 判断是否是平衡二叉树: public:bool IsBalance(){return _IsBalance(_root);}private:bool _IsBalance(Node* root){if (root nullptr)return true;int leftHeight _Height(root-_left);int rightHeight _Height(root-_right);if (leftHeight - rightHeight ! root-_bf){cout root-_kv.first 平衡因子异常 endl;return false;}return abs(leftHeight - rightHeight) 2 _IsBalance(root-_left) _IsBalance(root-_right);}int _Height(Node* root){if (root nullptr)return 0;int leftHeight _Height(root-_left);int rightHeight _Height(root-_right);return leftHeight rightHeight ? leftHeight 1 : rightHeight 1;} 中序遍历 public:void InOrder(){_InOrder(_root);cout endl;} private:void _InOrder(Node* root){if (root nullptr)return;_InOrder(root-_left);cout root-_kv.first ;_InOrder(root-_right);} main函数测试 #include iostream #include assert.h using namespace std;#include AVL.hvoid test1() {int a[] { 16, 3, 7, 11, 9, 26, 18, 14, 15 };AVLTreeint, int t;for (auto e : a){t.Insert(make_pair(e, e));}t.InOrder();cout t.IsBalance() endl; }void test2() {int a[] { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 };AVLTreeint, int t;for (auto e : a){t.Insert(make_pair(e, e));}t.InOrder();cout t.IsBalance() endl; }#include vector void test3() {const int N 30;vectorint v;v.reserve(N);srand(time(0));for (size_t i 0; i N; i){v.push_back(rand());cout v.back() endl;}AVLTreeint, int t;for (auto e : v){t.Insert(make_pair(e, e));cout Insert: e - t.IsBalance() endl;}cout t.IsBalance() endl; }int main() {test1();test2();test3();return 0; } 附AVL树实现完整代码 #pragma once #includeassert.h #include iostream using namespace std;//AVL树 //1.本质还是一颗二叉搜索树 //2.增加了平衡因子任何一颗子树的左右子树高度差绝对值不超过1templateclass K, class V struct AVLTreeNode {//三叉链AVLTreeNodeK, V* _left;AVLTreeNodeK, V* _right;AVLTreeNodeK, V* _parent;pairK, V _kv;int _bf; //平衡因子AVLTreeNode(const pairK, V kv):_left(nullptr), _right(nullptr), _parent(nullptr), _kv(kv), _bf(0){} };templateclass K, class V class AVLTree {typedef AVLTreeNodeK, V Node; public:bool Insert(const pairK, V kv){if (_root nullptr){_root new Node(kv);return true;}Node* parent nullptr;Node* cur _root;while (cur){if (cur-_kv.first kv.first){parent cur;cur cur-_right;}else if (cur-_kv.first kv.first){parent cur;cur cur-_left;}else{return false;}}cur new Node(kv);if (parent-_kv.first kv.first){parent-_right cur;cur-_parent parent;}else{parent-_left cur;cur-_parent parent;}while (parent) {//平衡因子的变化if (cur parent-_left){parent-_bf;}else{parent-_bf--;}if (parent-_bf 0) //之前为-1/1, cur填到了较低的一边树高不变不需要继续调整了!{break;}else if (parent-_bf 1 || parent-_bf -1) //之前为0, 当前树高1, 可能不再平衡了,向上调整!{cur parent;parent parent-_parent;}else if (parent-_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-_bf -2 cur-_bf 1){RotateRL(parent);}// 1、旋转让这颗子树平衡了// 2、旋转降低了这颗子树的高度恢复到跟插入前一样的高度所以对上一层没有影响不用继续更新break;}else{assert(false);}}return true;}void RotateL(Node* parent){Node* subR parent-_right;Node* subRL subR-_left;parent-_right subRL;subR-_left parent;//旋转之后整棵子树的根变了, 需要重新链接Node* parentParent parent-_parent;parent-_parent subR;if (subRL)subRL-_parent parent;if (_root parent){_root subR;subR-_parent nullptr;}else{if (parentParent-_left parent){parentParent-_left subR;}else{parentParent-_right subR;}subR-_parent parentParent;}parent-_bf subR-_bf 0;}void RotateR(Node* parent){Node* subL parent-_left;Node* subLR subL-_right;parent-_left subLR;if (subLR)subLR-_parent parent;Node* parentParent parent-_parent;subL-_right parent;parent-_parent subL;if (_root parent){_root subL;subL-_parent nullptr;}else{if (parentParent-_left parent){parentParent-_left subL;}else{parentParent-_right subL;}subL-_parent parentParent;}subL-_bf parent-_bf 0;}void RotateRL(Node* parent){Node* subR parent-_right;Node* subRL subR-_left;int bf subRL-_bf;RotateR(parent-_right);RotateL(parent);if(bf 0){parent-_bf subR-_bf subRL-_bf 0;}else if (bf -1){parent-_bf 1;subRL-_bf 0;subR-_bf 0;}else if (bf 1){parent-_bf 0;subRL-_bf 0;subR-_bf -1;}else{assert(false);}}//左右双旋void RotateLR(Node* parent){Node* subL parent-_left;Node* subLR subL-_right;int bf subLR-_bf; //subLR不可能为nullptr因为subL的平衡因子是-1RotateL(subL);RotateR(parent);//3、更新平衡因子if (bf 1){subLR-_bf 0;subL-_bf 0;parent-_bf -1;}else if (bf -1){subLR-_bf 0;subL-_bf 1;parent-_bf 0;}else if (bf 0){subLR-_bf subL-_bf parent-_bf 0;}else{assert(false); //在旋转前树的平衡因子就有问题}}void InOrder(){_InOrder(_root);cout endl;}bool IsBalance(){return _IsBalance(_root);}private:bool _IsBalance(Node* root){if (root nullptr)return true;int leftHeight _Height(root-_left);int rightHeight _Height(root-_right);if (leftHeight - rightHeight ! root-_bf){cout root-_kv.first 平衡因子异常 endl;return false;}return abs(leftHeight - rightHeight) 2 _IsBalance(root-_left) _IsBalance(root-_right);}int _Height(Node* root){if (root nullptr)return 0;int leftHeight _Height(root-_left);int rightHeight _Height(root-_right);return leftHeight rightHeight ? leftHeight 1 : rightHeight 1;}void _InOrder(Node* root){if (root nullptr)return;_InOrder(root-_left);cout root-_kv.first ;_InOrder(root-_right);} private:Node* _root nullptr; };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机作业做网站网站页脚信息

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 1月6日消息 谷歌起草“机器人宪法” 极越与福耀集团达成合作 三星电子宣布与现代汽车集团合作 OpenAI下周将推GP…

网站建设廴金手指花总壹柒昆山网站建设及推广

目录 1.认识PDCA: 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点: 5.案例 6.其他作用 1.认识PDCA: PDCA循环最早由美国质量统计控制之父Shewhat(休哈特)提出的PDS(Plan Do Se…

个人网站数据库大小深圳网站建设ucreator

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意:之前已经创建过容器的,需要打包成镜像,重新创建容器,因为要在创建…

网站网站娱乐建设wordpress置顶文章不生效

简介 将实例化代码提取出来,放到一个类中统一管理和维护,达到和主项目依赖关系的解耦,从而提高项目的扩展性和维护性。 工厂模式将复杂的对象创建工作隐藏起来,而仅仅暴露出一个接口供客户使用,具体的创建工作由工厂管…

口碑好的秦皇岛网站建设哪里有手机建网站制作

一、章节内容概述 战略规划帮助做好当前的业务以迎接未来。战略规划需要思考业务应该是什么,当前必须做什么才能赢得未来。战略规划需要进行风险决策,需要有组织地抛弃过去的业务,要求清晰界定和明确安排为实现理想的未来而开展的工作。战略…

建网站需要软件国内经典网站

1.程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现&…

自学网站编程有多少种做网站后台程序

几天前, WildFly 9发布了,可以肯定的重点之一是Undertow Web子系统中对HTTP / 2.0的支持。 由于Hawkular最近已开始使用WildFly 9(从8.2开始)作为其基础服务器,因此尝试将http2用于从Hawkular-Wildfly-Monitor客户端到…

上海网站推广多少钱wordpress实现pdf浏览

力扣 解题报告: 二分。但是有不少细节要考虑清楚。 所以干脆考虑另一种二分的方式。也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量取模完成。这样就不需要考虑边界情况了。 …

macOS 编辑字幕

只是为了记录。我使用的软件是 Tero Subtitler 参见:Subtitle editor software | Reddit

公司如何申请一个网站网址南京华璋建设网站

安装和创建虚拟环境 参考:linux系统下Python虚拟环境的安装和使用安装Django包 先进入虚拟环境,在联网下执行:pip install django1.8.7 1.8.7表示django的版本,如果不指定,会默认安装最新版的django。包会被安装到/usr…

网站建设是无形资产网页页面布局

这一节介绍一下 Django 的中间件。 关于中间件,官方文档的解释为:中间件是一个嵌入 Django 系统的 request 和 response 的钩子框架,是一个能够全局改变 Django 输入/输出的系统。 我们可以这样理解,一个 request 请求发送到 Dj…

reLeetCode 热题 100- 438. 找到字符串中所有字母异位词 - MKT

reLeetCode 热题 100- 438. 找到字符串中所有字母异位词 1 map 固定窗口实现 不够速度 词频统计 class Solution { public:vector<int> findAnagrams(string s, string p) {map<char,int> p_map;map<…

网站维护怎么样本溪网站设计公司

问题 你是否在项目中使用线程池遇到过以下问题&#xff1f; 1.创建线程池核心参数不好评估&#xff0c;随着业务流量的波动&#xff0c;极有可能出现生产故障。 2.不支持优雅关闭&#xff0c;当项目关闭时&#xff0c;大量正在运行的线程池任务被丢弃。 3.不支持运行时监控…

做产品表情的网站深圳罗湖网站建设

/*问题出现&#xff1a;如何检查一个目录是否可写&#xff0c;如何目录下还有目录和文件&#xff0c;那么都要检查思路&#xff1a;(1)首先先写出检查空目录是否可写的算法&#xff1a;在该目录中生成一个文件&#xff0c;如果不能生成&#xff0c;表明该目录没有写的权限(2)使…

一个网站两个域名吗软件工程开发流程

许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者&#xff0c;您无法使用营销团队&#xff0c;因此许多人通过推荐和他们的网络来产生需求。因此&#xff0c;扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…

网站投资多少钱网站建设标准合同

一、极验请求分析 滑块测试网站入口 我们首先访问极验滑块验证码测试主页&#xff0c;以便获取后续请求中的url。 滑块验证过程抓包 通过抓包工具分析滑块验证过程&#xff0c;发现与第三代滑块验证码相比&#xff0c;第四代简化了验证过程&#xff0c;加密参数w的生成也变得…

杭州网站建设官方蓝韵网络宁夏自治区住房城乡建设厅网站

目录 执行流程 拦截路径 过滤器链 小结 执行流程 过滤器Filter拦截到请求之后&#xff0c;首先执行方放行之前的逻辑&#xff0c;然后执行放行操作&#xff08;doFilter&#xff09;&#xff0c;然后会访问对应的Web资源&#xff08;对应的Controller类&#xff09;&#…

下载源代码的网站自学建百度首页网站

文章目录1 树的基本概念1.1 树的形式定义1.2 树的递归定义1.3 树的基本术语1.4 二叉树的递归定义1.5 存储方法1.6 满二叉树VS完全二叉树2 二叉树的性质3 代码实现1 树的基本概念 1.1 树的形式定义 T{D&#xff0c;R} D为树T中包含n个结点的有限集合&#xff0c;R为树中结点之间…

中通顺昌建设有限公司网站短视频拍摄剪辑培训班

Vue和React都是流行的JavaScript框架&#xff0c;用于构建用户界面。它们有以下区别&#xff1a; 语言&#xff1a;Vue使用基于HTML的模板语法&#xff0c;而React使用JSX&#xff0c;这是一种将HTML和JavaScript组合的语法。 学习曲线&#xff1a;Vue相对较容易学习&#xff…