Size Balanced Tree

论文足足看了两天,这是成果:

  1 #include <cstdio>
  2
  3 const int maxn = 1000000;
  4
  5 int n, a, b, c, root;
  6 int Child[maxn][2];
  7 int Key[maxn], Size[maxn], Count;
  8
  9 int New_node (int v)
 10 {
 11     Count++;
 12     Key[Count] = v;
 13     Size[Count] = 1;
 14     return Count;
 15 }
 16
 17 void Rotate (int& x, int d)
 18 {
 19     int k = Child[x][!d];
 20     Child[x][!d] = Child[k][d];
 21     Child[k][d] = x;
 22     Size[k] = Size[x];
 23     Size[x] = Size[Child[x][0]] + Size[Child[x][1]] + 1;
 24     x = k;
 25 }
 26
 27 void Maintain (int& t, int d)
 28 {
 29     if (!t) return;
 30     if (Size[Child[Child[t][d]][d]] > Size[Child[t][!d]])
 31         Rotate (t, !d);
 32     else if (Size[Child[Child[t][d]][!d]] > Size[Child[t][!d]])
 33         Rotate (Child[t][d], d), Rotate (t, !d);
 34     else return;
 35     Maintain (Child[t][0], 0);
 36     Maintain (Child[t][1], 1);
 37     Maintain (t, 0);
 38     Maintain (t, 1);
 39 }
 40
 41 void Insert (int& t, int v)
 42 {
 43     if (t == 0) t = New_node (v);
 44     else
 45     {
 46         Size[t]++;
 47         Insert (Child[t][v >= Key[t]], v);
 48         Maintain (t, v >= Key[t]);
 49     }
 50 }
 51
 52 int Delete (int& t, int v)
 53 {
 54     int Ret;
 55     Size[t]--;
 56     if (v == Key[t] || Child[t][v > Key[t]] == 0)
 57     {
 58         Ret = Key[t];
 59         if (Child[t][0] && Child[t][1])
 60             Key[t] = Delete (Child[t][0], v + 1);
 61         else t = Child[t][0] + Child[t][1];
 62     }else
 63         Ret = Delete (Child[t][v > Key[t]], v);
 64     return Ret;
 65 }
 66
 67 int Rank (int t, int v)
 68 {
 69     if (t == 0) return 1;
 70     if (v <= Key[t]) return Rank (Child[t][0], v);
 71     return Rank (Child[t][1], v) + Size[Child[t][0]] + 1;
 72 }
 73
 74 int Select (int t, int k)
 75 {
 76     if (Child[t][0] && Size[Child[t][0]] >= k)
 77         return Select (Child[t][0], k);
 78     if (Size[Child[t][0]] + 1 == k) return Key[t];
 79     return Select (Child[t][1], k - Size[Child[t][0]] - 1);
 80 }
 81
 82 void Print (int t)
 83 {
 84     if (t == 0) return;
 85     Print (Child[t][0]);
 86     printf ("%d ", Key[t]);
 87     Print (Child[t][1]);
 88 }
 89
 90 int main ()
 91 {
 92     scanf ("%d", &n);
 93     for (int i = 0; i < n; i++)
 94     {
 95         scanf ("%d %d", &a, &b);
 96         if (a == 1) Insert (root, b);
 97         if (a == 2)
 98         {
 99             c = Delete (root, b);
100             if (c != b) Insert (root, c);
101         }
102         if (a == 3) printf ("%d\n", Select (root, b));
103         if (a == 4) printf ("%d\n", Rank (root, b));
104         if (a == 5)
105         {
106             if (b == 1)
107             {
108                 for (int j = 1; j <= Count; j++)
109                     printf ("Child : %d %d, Key : %d\n", Child[j][0], Child[j][1], Key[j]);
110             }else Print (root), printf ("\n");
111         }
112     }
113 }
时间: 2024-07-29 14:08:42

Size Balanced Tree的相关文章

Size Balanced Tree(SBT) 模板

首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树的第二条定义,可以很方便地利用这种特点在二叉树中以O(logn)的渐进复杂度完成插入.查找.删除等操作. 但是这里还是有个问题,就是弄不好的话,一棵普通的二叉搜索树经过多次修改操作之后可能会导致整棵树左右“不平衡”,出现一边结点很多,另一边结点很少的情况,这样最终每一次的操作时间就会大大偏离O(lo

SBT(Size Balanced Tree)

1. 二叉搜索树 二叉搜索树,是一种能实现动态查询第k大或查询,某数在序列中的排名的树形结构,在数据较为随机的情况下,它的期望复杂度为O(logn),但是若是数据为一个有序序列,那么该二叉搜索树,将会变成一条链,此时每次查找的复杂度将会变成复杂度为O(n) 2. SBT 针对上述问题,为了能使复杂度回到O(logn),我们在每次插入操作后,对树形进行高效的调整使之变的较为平衡.这时树高变成logn 而搜索的复杂度也于是会变回logn为此我们引入左旋和右旋操作 void zx(int &x) {

56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]

[本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树.例如下图中的二叉树就是一棵平衡二叉树: [分析] 之前的博文27.二元树的深度[BinaryTreeDepth]中介绍过如何求二叉树的深度.有了经验之后再解决这个问题,我们很容易就能想到思路. [方案1] 先判断左右子树是不是平衡的

【LeetCode】Balanced Tree &amp; Binary Search Tree

整合两道差不多的题目放上来,其中第一题是第二题的基础. 1. Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than one. 所谓

重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)

平衡树 1.定义 对于每个结点,左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们按照1-n的顺序插入到二叉排序树中,那么二叉排序树就退化成了一个有序链表,效率大大降低. 2.有关概念 所有平衡树基本由以下三个特征组成: 1.自平衡条件 2.旋转操作 3.旋转的触发 平衡树通过设置合理的自平衡条件,使得二叉排序树的查找.插入等操作的性能不至于退化到 O(n)O(n),并且在进行二叉排序树的查找.插入等操作时进行判断,如果满足其中某个旋转的触发条件,则

二叉查找树 Binary Serach Tree

二叉查找树(Binary Serach Tree, BST)是一棵二叉树,树上每个节点存储着一个元素.对于树上每个节点X,它的左子树中所有元素均小于X,而它的右子树中所有元素均大于X.且树上不允许出现相同的节点. 这意味着只要对树做一遍中序遍历,就得到一个有序的序列. 屏幕剪辑的捕获时间: 2017/5/29 11:09 一.基本操作和实现 首先定义结点的结构. 为了避免访问NULL指针,定义一个nil节点作为哨兵节点. constexpr int l = 0, r = 1; constexpr

平衡二叉树

1.基础知识 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:1.它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.2.其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度.3.平衡二叉树的常用算法有红黑树.AVL.Treap等. 4.最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,

hdu 4006 The kth great number (优先队列+STB+最小堆)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6637    Accepted Submission(s): 2671 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

二叉树的应用详解 - 数据结构

二叉树的应用详解 - 数据结构 概述: 平衡树——特点:所有结点左右子树深度差≤1 排序树——特点:所有结点“左小右大字典树——由字符串构成的二叉排序树判定树——特点:分支查找树(例如12个球如何只称3次便分出轻重)带权树——特点:路径带权值(例如长度) 最优树——是带权路径长度最短的树,又称 Huffman树,用途之一是通信中的压缩编码. 1. 二叉排序树(二叉查找树 Binary Search Tree): 1.1 二叉排序树: 或是一棵空树:或者是具有如下性质的非空二叉树: (1)若左子树