C基础 - 终结 Size Balanced Tree】的更多相关文章

引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github.com/iamrandom/randnet (1) 了解到 陈启峰 2006-12-29 高中的时候写的论文 Size Balanced Tree(一种变种的 AVI 树) 感觉好精彩. 就着手翻译成实战代码. 陈启峰 Size Balanced Tree - https://files.cnblo…
首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树的第二条定义,可以很方便地利用这种特点在二叉树中以O(logn)的渐进复杂度完成插入.查找.删除等操作. 但是这里还是有个问题,就是弄不好的话,一棵普通的二叉搜索树经过多次修改操作之后可能会导致整棵树左右“不平衡”,出现一边结点很多,另一边结点很少的情况,这样最终每一次的操作时间就会大大偏离O(lo…
Size Balanced Tree(SBT)是目前速度最快的平衡二叉搜索树,且能够进行多种搜索操作,区间操作:和AVL.红黑树.伸展树.Treap类似,SBT也是通过对节点的旋转来维持树的平衡,而相比其他平衡树,SBT维持平衡所需要的额外数据很少,只需要维持以当前节点为根的子树的大小:且SBT的编写复杂度低.因此具有空间优势.速度优势.编写优势. SBT的节点 SBT节点维持很少的额外信息,只需要知道以当前节点为根的子树的大小. struct TreeNode{ int data; TreeN…
不想用treap和Splay,那就用SB树把,哈哈,其实它一点也SB,厉害着呢. 先膜拜一下作者陈启峰.Orz 以下内容由我搜集整理得来. 一.BST及其局限性 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 1.若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2.任意节点的右子树不空,则右子树上所有结点的值均大于它的根结…
SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一个节点之后,SBT的性质会有所改变,此时需要函数maintain(mt)来维持平衡 mt(T)用于修复以T为根的子树的SBT 调用mt(T)的前提是T的子树都已经是SBT了 {由于左右对称,这里只讨论关于上图第一个不等式不成立的例子} 情形1:size[A] > size[R] 此时只需继续mt(A…
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int _rand() { +; } template <class T> struct SbtNode { T val; int lSize; int rSize; int lch; int rch; void assignVir() { lSize=rSize=lch=rch=; } void ass…
定义 SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小 即size(x->l)$\ge$size(x->r->l),size(x->r->r),右边同理size(x->r)$\ge$size(x->l->l),size(x->l->r) 具体操作 旋转 旋转几乎是所有平衡树所共有的操作,操作方法也基本相同 void rotate(SBT *&x,int d){//旋转操作,d=0表示左旋,d=1表示右旋…
ADT基础(二)-- Tree,Heap and Graph 1 Tree(二叉树) 先根遍历 (若二叉树为空,则退出,否则进行下面操作) 访问根节点 先根遍历左子树 先根遍历右子树 退出 访问顺序为:A.B.D.H.I.E.J.C.F.G 中根遍历(若二叉树为空,则退出,否则进行下面操作) 中根遍历左子树 访问根节点 中根遍历右子树 退出 访问顺序为:H.D.I.B.J.E.A.F.C.G 后根遍历(若二叉树为空,则退出,否则进行下面操作) 后根遍历左子树 后根遍历右子树 访问根节点 退出 访…
/* * tree[x].left 表示以 x 为节点的左儿子 * tree[x].right 表示以 x 为节点的右儿子 * tree[x].size 表示以 x 为根的节点的个数(大小) */ struct SBT { int key,left,right,size; } tree[10010]; int root = 0,top = 0; void left_rot(int &x) // 左旋 { int y = tree[x].right; if (!y) return; tree[x]…
[本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树.例如下图中的二叉树就是一棵平衡二叉树: [分析] 之前的博文27.二元树的深度[BinaryTreeDepth]中介绍过如何求二叉树的深度.有了经验之后再解决这个问题,我们很容易就能想到思路. [方案1] 先判断左右子树是不是平衡的…