数据结构【AVL树】

数据结构【AVL树】

AVL树

1.AVL树

1.1AVL的概念

AVL树可以是一个空树。
它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通过控制高度差去控制平衡。
AVL树整体结点数量和分布和完全二叉树类似,高度可以控制在 logN ,那么增删查改的效率也可以控制在O(logN ) ,相比二叉搜索树有了本质的提升。

1.2平衡因子

结点的平衡因子=右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于0/1/-1,AVL树并不是必须要平衡因子,但是有了平衡因子可以更方便我们去进行观察和控制树是否平衡,就像⼀个风向标一样。
为什么AVL树是高度平衡搜索二叉树,要求高度差不超过1,而不是高度差是0呢?
因为例如二和四个结点无法达到0.

2.AVl树的实现

2.1AVL树的结构

template<classK,classV>structAVLTreeNode{// 需要parent指针,后续更新平衡因⼦可以看到 pair<K, V> _kv; AVLTreeNode<K, V>* _left; AVLTreeNode<K, V>* _right; AVLTreeNode<K, V>* _parent;int _bf;// balance factorAVLTreeNode(const pair<K, V>& kv):_kv(kv),_left(nullptr),_right(nullptr),_parent(nullptr),_bf(0){}};template<classK,classV>classAVLTree{typedef AVLTreeNode<K, V> Node;public://...private: Node * _root =nullptr;};

2.2AVL树的插入

boolInsert(const pair<K, V>& kv){if(_root ==nullptr){ _root =newNode(kv);returntrue;} Node* parent =nullptr; Node* cur = _root;while(cur){if(cur->_kv.first < kv.first){ parent = cur; cur = cur->_right;}elseif(cur->_kv.first > kv.first){ parent = cur; cur = cur->_left;}else{returnfalse;}} cur =newNode(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;}elseif(parent->_bf ==1|| parent->_bf ==-1){// 继续往上更新 cur = parent; parent = parent->_parent;}elseif(parent->_bf ==2|| parent->_bf ==-2){// 不平衡了,旋转处理break;}else{assert(false);}}returntrue;}

2.3 旋转

2.3.1 旋转的原则

保持搜索树的规则
让旋转的树从不满足变平衡,其次降低旋转树的高度
旋转总共分为四种,左单旋/右单旋/左右双旋/右左双旋。

Read more

Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙

Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙

前言 在现代应用开发中,我们无时无刻不在与“对象”打交道——用户信息、商品详情、配置项、会话数据……如何高效、清晰地在缓存或数据库中存储这些结构化数据,是每一个开发者都需要面对的课题。 你可能会想到将一个对象序列化成 JSON 字符串,然后用一个简单的 Key-Value 方式存入 Redis。这确实是一种方法,但当你只想修改对象的某一个属性(比如用户的积分)时,就不得不读取整个 JSON 字符串,反序列化成对象,修改属性,再序列化回 JSON,最后整个写回 Redis。这个过程不仅繁琐,而且在并发环境下极易引发数据覆盖问题,性能开销也相当可观。 那么,有没有一种更原生、更高效的方式来处理这种“对象”存储呢?答案是肯定的。Redis 为我们提供了一种强大的数据结构,它天生就是为了解决这类问题而生——Hash(哈希/散列)。 本文将带领你深入探索 Redis Hash

By Ne0inhk
玩转二叉树:数据结构中的经典之作

玩转二叉树:数据结构中的经典之作

、 嘿嘿,家人们,今天咱们来详细剖析数据结构中的二叉树,好啦,废话不多讲,开干! 1:树的概念以及结构 1.1:树的概念 1.2:树的相关概念 1.3:树的表示 1.3.1:左孩子右兄弟表示法 2:二叉树的概念以及结构 2.1:概念 2.2:特殊的二叉树 2.3:二叉树的性质 2.4:二叉树的存储结构 2.4.1:顺序存储 2.4.2:链式存储 3:二叉树的顺序结构以及实现 3.1:二叉树的顺序结构 3.2:

By Ne0inhk