AVL

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 struct node;
  4 node *null;
  5 struct node{
  6     node *lc, *rc;
  7
  8     int dep;
  9     int key, value;
 10
 11     inline void init(int _key, int _value)
 12     {
 13         lc=rc=null;
 14         dep=1;
 15         key = _key;
 16         value = _value;
 17     }
 18     inline void up(){ dep = max(lc->dep, rc->dep)+1; }
 19 };
 20 class AVL{
 21     node *root;
 22 public:
 23     AVL(){
 24         null=new node;
 25         null->lc=null->rc=null;
 26         null->dep=0;
 27         root=null;
 28     }
 29     void RightRotate(node *&x)
 30     {
 31         node *t=x->lc;
 32         x->lc = t->rc;
 33         t->rc = x;
 34         x->up();
 35         t->up();
 36         x = t;
 37     }
 38     void LeftRotate(node *&x)
 39     {
 40         node *t=x->rc;
 41         x->rc = t->lc;
 42         t->lc = x;
 43         x->up();
 44         t->up();
 45         x = t;
 46     }
 47     void Insert(int key, int value)
 48     {
 49         Insert(root, key, value);
 50     }
 51     void Insert(node *&x, int key, int value)
 52     {
 53         if(x==null){
 54             x=new node;
 55             x->init(key, value);
 56             return ;
 57         }
 58         if(key < x->key){
 59             Insert(x->lc, key, value);
 60             if(x->lc->dep - x->rc->dep == 2){
 61                 if(key < x->lc->key)    RightRotate(x);
 62                 else    LeftRotate(x->lc), RightRotate(x);
 63             }
 64         }
 65         else{
 66             Insert(x->rc, key, value);
 67             if(x->rc->dep - x->lc->dep == 2){
 68                 if(key >= x->rc->key)    LeftRotate(x);
 69                 else    RightRotate(x->rc), LeftRotate(x);
 70             }
 71         }
 72         x->up();
 73     }
 74     int find(int key)const
 75     {
 76         return find(root, key);
 77     }
 78     int find(const node *x, const int key)const
 79     {
 80         if(x == null)    return 0;
 81         if(x->key == key)    return x->value;
 82         else if(x->key > key)    return find(x->lc, key);
 83         else    return find(x->rc, key);
 84     }
 85     void ReBalance(node *&x)
 86     {
 87         if(x->lc->dep - x->rc->dep == 2){
 88             if(x->lc->lc->dep >= x->lc->rc->dep)    RightRotate(x);
 89             else    LeftRotate(x->lc), RightRotate(x);
 90         }
 91         else if(x->rc->dep - x->lc->dep == 2){
 92             if(x->rc->rc->dep >= x->rc->lc->dep)    LeftRotate(x);
 93             else    RightRotate(x->rc), LeftRotate(x);
 94         }
 95     }
 96     bool DelNode(int key)
 97     {
 98         return DelNode(root, key);
 99     }
100     node* DelMax(node *&x)
101     {
102         if(x->rc != null){
103             node *t=DelMax(x->rc);
104             x->up();
105             ReBalance(x);
106             return t;
107         }
108         else{
109             node *t=x;
110             x = x->lc;
111             return t;
112         }
113     }
114     bool DelNode(node *&x, int key)
115     {
116         if(x==null)    return false;
117         if(x->key == key){
118             if(x->lc==null || x->rc==null){
119                 x = x->lc==null ? x->rc : x->lc;
120                 return true;
121             }
122             else{
123                 node *t=DelMax(x->lc);
124                 t->lc = x->lc;
125                 t->rc = x->rc;
126                 delete x;
127                 x = t;
128             }
129         }
130         if(key < x->key)    DelNode(x->lc, key);
131         else    DelNode(x->rc, key);
132         if(x!=null)
133             x->up();
134         ReBalance(x);
135     }
136 };
137 AVL A;
138 A.Insert(key, value);
139 A.find(key);
140 A.DelNode(key);
时间: 2024-10-12 19:26:14

AVL的相关文章

AVL树

定义:AVL树是每个节点左子树和右子树的高度差最大为1的二叉查找树 不平衡节点:假设在懒惰删除(删除操作时,并不删除节点,只是对节点进行特定标记)的条件下,插入操作有可能破坏AVL树的平衡特性. 如果插入节点导致平衡性被破坏,那么平衡性遭到破坏的节点只可能出现在插入节点到根节点的路径上.因为插入操作只会改变 插入节点的父节点的高度,而这些父节点就再这条路径上. 调整:对于平衡性遭到破坏的节点,需要对其进行调整以恢复平衡性.调整的方法称为旋转,针对不同的插入情况,调整操作稍有不同. 下面先对插入情

数据结构--AVL树

AVL树是高度平衡的二叉搜索树,较搜索树而言降低了树的高度:时间复杂度减少了使其搜索起来更方便: 1.性质: (1)左子树和右子树高度之差绝对值不超过1: (2)树中每个左子树和右子树都必须为AVL树: (3)每一个节点都有一个平衡因子(-1,0,1:右子树-左子树) (4)遍历一个二叉搜索树可以得到一个递增的有序序列 2.结构: 平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进.二叉搜索树有一个缺点就是,树的结构是无法预料的.任意性非常大.它仅仅与节点的值和插入的顺序有关系.往往得到的是

04-树4. Root of AVL Tree (25)

04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any tim

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

算法:avl树的实现

avl.h #ifndef _AVLTREE_H #define _AVLTREE_H struct Node; typedef int ElementType; typedef struct Node *PtrToNode; typedef PtrToNode AvlTree; typedef PtrToNode Position; AvlTree MakeEmpty(AvlTree T); int Height(Position P); Position Find(ElementType X

红黑树与AVL(平衡二叉树)的区别

关于红黑树和AVL树,来自网络: 1 好处 及 用途 红黑树 并不追求"完全平衡 "--它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能. 红黑树能够以 O(log2  n)  的时间复杂度进行搜索.插入.删除操作.此外,由于它的设计,任何不平衡都会在三次旋转之内解决.当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较"便宜"的解决方案.红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高

AVL树原理及实现(C语言实现以及Java语言实现)

欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好是按照从小到大的顺序或者从大到小的顺序插入的,那么搜索二叉树就对退化成链表,这个时候查找,插入和删除的时间都会上升到O(n),而这对于海量数据而言,是我们无法忍受的.即使是一颗由完全随机的数据构造成的搜索二叉树,从统计角度去分析,在进行若甘次的插入和删除操作,这个搜索二叉树的高度也不能令人满意.这个

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

AVL树 冲突链表

;红黑树只不过是AVL树的变种而已 ,平衡方式耕地,意味着比AVL旋转的次数少,长应用于关联数组 红黑树和AVL树在实际开发中比较常用 ;AVL树二叉平衡树 适合在内存中使用速度会达到最优化,要是在文件中那么速度大大降低 ;文件中适合用b+树,B+树读文件一次读的孩子结点比较多,一次read读取尽量多的结点到内存中缓存起来,下次直接从内存中返回. ;百万级别的数据存文件用c库函数利用缓冲区一次不要读两个缓冲区的内容(<4096)设计树的结构,超过就自己设计fopen喽自己做大的缓冲区,降低文件访

AVL树,红黑树,B-B+树,Trie树原理和应用

前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作(如插入删除等等) 目录 AVL树 AVL树原理与应用 红黑树 红黑树原理与应用 B/B+树 B/B+树原理与应用 Trie树 Trie树原理与应用 AVL树 简介: AVL树是最早的自平衡二叉树,在早期应用还相对来说比较广,后期由于旋转次数过多而被红黑树等结构取代(二者都是用来搜索的),AVL树内