平衡树

替罪羊树模版 普通平衡树

允我心安 提交于 2019-11-28 10:39:57
替罪羊树,代码贼长,我哭了。。。 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; const int maxn = 1e5+5; const double alpha = 0.75; struct node{ int l,r,val; int size,fact; ///子树大小,实际大小 bool exist; }tzy[maxn]; int cnt,root; ///新建节点 void newnode(int &now,int val) { now=++cnt; tzy[now].val=val; tzy[now].size=tzy[now].fact=1; tzy[now].exist=true; } ///判断是否平衡 bool imbalance(int now) { ///左右子树的size中最大的一个的大小大于节点大小*平衡因子 ///被删掉的节点个数大于0.3 if(max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>tzy[now].size*alpha || tzy[now].size-tzy[now].fact>tzy[now].size*0

二叉查找树(查找、插入、删除)——C语言

落爺英雄遲暮 提交于 2019-11-27 06:10:17
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本 AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,例如在在删除时, 我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,使得它的操作时间复杂度增加 例如下面这种情况: AVL树的特性让二叉搜索树的节点实现平衡