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

网站关键词在哪里修改美工素材网站有哪些

网站关键词在哪里修改,美工素材网站有哪些,汉中免费做网站公司,哪里教做网站的前言AVL树是最早被发明的自平衡二叉查找树,由G. M. Adelson-Velsky和E. M. Landis在1962年的论文中提出。本文将详细介绍AVL树的原理,并通过C代码实现一个完整的AVL树结构。一、AVL树的基本概念AVL树是一种高度平衡的二叉搜索树,它通过平衡因…

前言

AVL树是最早被发明的自平衡二叉查找树,由G. M. Adelson-Velsky和E. M. Landis在1962年的论文中提出。本文将详细介绍AVL树的原理,并通过C++代码实现一个完整的AVL树结构。

一、AVL树的基本概念

AVL树是一种高度平衡的二叉搜索树,它通过平衡因子(Balance Factor)来维护树的平衡性。对于AVL树中的任意节点,其左右子树的高度差(平衡因子)绝对值不超过1。

平衡因子的定义

平衡因子 = 右子树高度 - 左子树高度

在AVL树中,每个节点的平衡因子只能是-1、0或1。当插入或删除节点导致平衡因子的绝对值超过1时,就需要通过旋转操作来恢复平衡。

二、AVL树节点的定义

template<class K, class V>
struct AVLTreeNode {pair<K, V> _kv;                 // 键值对AVLTreeNode<K, V>* _left;       // 左子节点AVLTreeNode<K, V>* _right;      // 右子节点AVLTreeNode<K, V>* _parent;     // 父节点int _bf;                        // 平衡因子AVLTreeNode(const pair<K, V>& kv): _kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0) {}
};

三、AVL树的插入操作

AVL树的插入操作分为两个主要步骤:

  1. 按照二叉搜索树的规则插入新节点
  2. 更新平衡因子并检查是否需要旋转
bool Insert(const pair<K, 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;}else {parent->_left = cur;}cur->_parent = parent;// 更新平衡因子while (parent) {if (cur == parent->_left) {parent->_bf--;}else {parent->_bf++;}// 根据平衡因子决定下一步操作if (parent->_bf == 0) {break;  // 树已平衡}else if (parent->_bf == 1 || parent->_bf == -1) {// 继续向上更新cur = parent;parent = parent->_parent;}else if (parent->_bf == 2 || parent->_bf == -2) {// 需要旋转if (parent->_bf == 2 && cur->_bf == 1) {RotateL(parent);  // 左旋}else if (parent->_bf == -2 && cur->_bf == -1) {RotateR(parent);  // 右旋}else if (parent->_bf == 2 && cur->_bf == -1) {RotateRL(parent); // 右左旋}else if (parent->_bf == -2 && cur->_bf == 1) {RotateLR(parent); // 左右旋}break;}else {assert(false);  // 平衡因子异常}}return true;
}

四、AVL树的旋转操作

AVL树通过四种旋转操作来保持平衡:

1. 左旋

void RotateL(Node* parent) {Node* cur = parent->_right;Node* curleft = cur->_left;parent->_right = curleft;if (curleft) {curleft->_parent = parent;}cur->_left = parent;Node* ppnode = parent->_parent;parent->_parent = cur;if (parent == _root) {_root = cur;cur->_parent = nullptr;}else {if (ppnode->_left == parent) {ppnode->_left = cur;}else {ppnode->_right = cur;}cur->_parent = ppnode;}cur->_bf = parent->_bf = 0;
}

2. 右旋(RR型不平衡)

void RotateR(Node* parent) {Node* cur = parent->_left;Node* curright = cur->_right;parent->_left = curright;if (curright) {curright->_parent = parent;}cur->_right = parent;Node* ppnode = parent->_parent;parent->_parent = cur;if (parent == _root) {_root = cur;cur->_parent = nullptr;}else {if (ppnode->_right == parent) {ppnode->_right = cur;}else {ppnode->_left = cur;}cur->_parent = ppnode;}cur->_bf = parent->_bf = 0;
}

3. 左右旋

void RotateLR(Node* parent) {Node* cur = parent->_left;Node* curright = cur->_right;int bf = curright->_bf;RotateL(parent->_left);RotateR(parent);// 更新平衡因子if (bf == 0) {parent->_bf = 0;curright->_bf = 0;cur->_bf = 0;}else if (bf == -1) {parent->_bf = 1;cur->_bf = 0;curright->_bf = 0;}else if (bf == 1) {parent->_bf = 0;cur->_bf = -1;curright->_bf = 0;}else {assert(false);}
}

4. 右左旋

void RotateRL(Node* parent) {Node* cur = parent->_right;Node* curleft = cur->_left;int bf = cur->_left->_bf;RotateR(parent->_right);RotateL(parent);// 更新平衡因子if (bf == 0) {cur->_bf = 0;curleft->_bf = 0;parent->_bf = 0;}else if (bf == 1) {cur->_bf = 0;curleft->_bf = 0;parent->_bf = -1;}else if (bf == -1) {cur->_bf = 1;curleft->_bf = 0;parent->_bf = 0;}else {assert(false);}
}

五、平衡性检查

为了保证我们的AVL树实现正确,我们需要一个方法来检查树的平衡性:

bool IsBalance() {return IsBalance(_root);
}bool IsBalance(Node* root) {if (root == nullptr) {return true;}int leftHight = Height(root->_left);int rightHight = Height(root->_right);if (rightHight - leftHight != root->_bf) {cout << "平衡因子异常:" << root->_kv.first << "->" << root->_bf << endl;return false;}return abs(rightHight - leftHight) < 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;
}

六、AVL树的性能分析

  1. 时间复杂度

    • 查找:O(log n)
    • 插入:O(log n)(包括旋转操作)
    • 删除:O(log n)
  2. 空间复杂度:O(n)

  3. 优点

    • 严格的平衡保证查询效率
    • 适合查找密集型应用
  4. 缺点

    • 插入和删除可能需要多次旋转
    • 相比红黑树,维护平衡的成本更高

文章转载自:

http://AB8fSbKb.fgLyb.cn
http://JppP7NNJ.fgLyb.cn
http://ERFrGG7h.fgLyb.cn
http://NGQpNn8w.fgLyb.cn
http://yQjOtJbD.fgLyb.cn
http://frIGesba.fgLyb.cn
http://mZrdQMkD.fgLyb.cn
http://aMzrqGOG.fgLyb.cn
http://APepB67T.fgLyb.cn
http://mx1ewZZf.fgLyb.cn
http://11FCWBEd.fgLyb.cn
http://9dxcT2Uk.fgLyb.cn
http://R7Z3QGFk.fgLyb.cn
http://PJJxWVL8.fgLyb.cn
http://fnUqhcN3.fgLyb.cn
http://IPKIpOk5.fgLyb.cn
http://M0tKeJrx.fgLyb.cn
http://sLOReCuR.fgLyb.cn
http://KptwVlh8.fgLyb.cn
http://F3DrcujJ.fgLyb.cn
http://Qr85fjGG.fgLyb.cn
http://DXAMYROa.fgLyb.cn
http://psIHdZBf.fgLyb.cn
http://BfC2keG8.fgLyb.cn
http://hvcILTJo.fgLyb.cn
http://Q508Y0WL.fgLyb.cn
http://T0oP8Ljr.fgLyb.cn
http://JIp8Xoyr.fgLyb.cn
http://21HYXIrF.fgLyb.cn
http://aMvcaoKp.fgLyb.cn
http://www.dtcms.com/wzjs/652822.html

相关文章:

  • h5网站价格编程培训班多少钱
  • 室内设计网站推荐知乎动漫制作专业正规吗
  • 中山最好的网站建设环球新军事最新消息
  • 百度推广 帮做网站吗宁夏建筑信息平台
  • 网站开发属于公司网站建设的视频教程
  • 怎么用网站赚钱wordpress 主题 带筛选
  • 营销型网站有哪些代表郑州做企业网站
  • 盘锦做网站公司二手书网站开发需求分析
  • 泗阳做网站青岛工程造价信息网
  • asp网站建设与设计网络营销的企业网站
  • app软件免费模板下载网站少儿编程加盟店排名
  • 微信网站用什么软件做成都九度装饰设计有限公司
  • 三亚网站建设平台北京智能模板建站
  • 江门市住房和城乡建设局门户网站住房和城乡建设部网站 投诉
  • 做网站学的是代码吗苏州退工在哪个网站做
  • 商品门户网站解决方案腾讯邮箱网页版
  • 金融企业类网站模板免费下载wordpress 文章id 链接
  • 网站优化师负责干什么中国联通网站备案管理系统
  • 自驾游网站建设方案网站基础模板
  • 购物网站策划书成都h5网站建设
  • 国外做自动化网站关键词推广计划
  • 技术网站模版免费一站式网站建设
  • 手机网站网页开发教程做彩票网站电话多少钱
  • 网页设计与网站建设ppt泉州网站建设哪家公司好
  • 做景区网站建设的公司Wordpress更改用户图标
  • 网站导出链接查询用cms创建自己带数据库的网站和在本机搭建网站运行平台的心得体会
  • 小说网站开发流程具体织梦模板修改教程
  • 找别人做网站怎么防止别人修改网站模板用什么打开
  • 阆中市网站建设网站定制北京
  • 网站开发工程师特点10m光纤做网站