#include<iostream>
#include<stdlib.h>
#include<math.h> using namespace std;
class Node{
public:
int el;
Node *left,*right;
Node(){
left=0;right=0;
}
Node(int data){
el = data;left=0;right=0;
}
};
class Tree{
public:
Node *root;
Tree(){
root=0;size=0;
}
Tree(int el){
root=new Node(el);size=1;
}
void insert(int el){
Node *ins = new Node(el),*tmp=root,*par;
if(tmp==0){
root = ins;
size++;
return;
}
while(tmp!=0){
par = tmp;
if(tmp->el>el)tmp = tmp->left;
else tmp = tmp->right;
}
if(par->el>el)
par->left = ins;
else
par->right = ins;
size++;
} // 转换成右链
void creatBackbone(){
Node *Gr=0,*par=root,*ch=0;
while(par!=0){
ch = par->left;
if(ch!=0){
rotateRight(Gr,par,ch);
par=ch;
}else{
Gr=par;
par=par->right;
}
// 旋转过程中,如果是绕根节点的右节点旋转时要将根节点置为原根节点的右节点
if(Gr==0)root = ch;
}
}
void rotateRight(Node *Gr,Node *par,Node *ch){ if(Gr!=0)Gr->right=ch;
par->left=ch->right;
ch->right=par;
}
// 平衡二叉树
void creatPerfectTree(){
int n = size;
int m = (1<<((int)(log10(n+1)/log10(2))))-1;
int i;
Node *Gr=0,*tmp;
if(size<3)return;printf("%d\n",m);
for(i=0,Gr=root;i<n-m;i++){
if(i==0){
// 此处Gr是旋转时被绕的节点的祖父节点,下边以Gr->right传引用方便旋转函数赋值操作
Gr = Gr->right;
rotateLeft(root);
}else if(Gr&&Gr->right){
// 提前保存下次绕点的祖父节点,旋转后它们之间关系被破坏
tmp = Gr->right->right;
rotateLeft(Gr->right);
Gr = tmp;
}
}
while(m>1){
m = m/2;
for(i=0,Gr=root;i<m;i++){
if(i==0){
Gr = Gr->right;
rotateLeft(root);
}else if(Gr&&Gr->right){
tmp = Gr->right->right;
rotateLeft(Gr->right);
Gr = tmp;
}
}
}
}
void rotateLeft(Node *&Gr){
if(!Gr) return;
Node *par = Gr->right;
if(!par)return;
Node *ch = par->right;
Gr->right=par->left;
par->left=Gr;
Gr = par;
}
private:
int size;
};
int main(){ int a[] = {0,3,4,5,6,1,2,7,11,12,8,9,10,13,14};
int i;
Tree *tree = new Tree();
for(i=0;i<15;i++){
tree->insert(a[i]);
}
tree->creatBackbone();
tree->creatPerfectTree();
return 0;
}

  

平衡二叉树DSW算法的更多相关文章

  1. 二叉查找树的平衡(DSW算法)

    树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度O(log(N)),而链表为O(N),但理想情况指的是什么情况呢?一般指树是完全 ...

  2. 平衡二叉树---Shaolin

    Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temp ...

  3. B树索引

    在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能高.在OLAP中尤其明显,要完全理解索引的 ...

  4. 树的平衡之AVL树——错过文末你会后悔,信我

    学习数据结构应该是一个循序渐进的过程: 当我们学习数组时,我们要体会数组的优点:仅仅通过下标就可以访问我们要找的元素(便于查找). 此时,我们思考:假如我要在第一个元素前插入一个新元素?采用数组需要挪 ...

  5. [数据结构 - 第6章] 树之二叉平衡树(C语言实现)

    一.什么是平衡二叉树? 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两 ...

  6. 二叉树、B树、B+树、B*树、VAL树、红黑树

    二叉搜索树 每个节点只存储一个关键字, 每个节点最多有两个子节点, 左子节点存储的关键字小于本节点存储的关键字 右子节点存储的关键字大于本节点存储的关键字 搜索时,从根节点开始搜索,小于走左结点,大于 ...

  7. JavaSE-万字长文-加载时间长-小白文

    Java语法规范 所有的Java语句必须以;结尾! 无论是().[]还是{},所有的括号必须一一匹配! 主方法的代码只能写在{}中! Java基础语法(面向过程) 在学习面向对象之前,我们需要了解面向 ...

  8. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  9. 数据结构与算法--从平衡二叉树(AVL)到红黑树

    数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...

随机推荐

  1. 43_2.VUE学习之--不使用组件computed计算属性超简单的实现美团购物车原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MySQL查询优化 对not in 、in 的优化

    因为 not in不走索引,所以不在不得已情况下,就不要使用not in 下面使用 join 来替代not in 做查询 select ID from A where ID not in (selec ...

  3. GCJ:2008 Round1AA-Minimum Scalar Product(有序数组倒序乘积和最小)

    题目链接:https://code.google.com/codejam/contest/32016/dashboard#s=p0 Minimum Scalar Product This contes ...

  4. DFS:C 小Y的难题(1)

    解题心得: 1.在明确使用DFS之后一定要找到递归函数的出口.方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值).递归时也要有递归的方向,最后都能够达到递归的出 ...

  5. url_maneger.py

    coding=UTF-8 # url管理器 class urlManeger: def __init__(self): self.new_urls = set() self.old_urls = se ...

  6. struts2官方 中文教程 系列五:处理表单

    先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列五:处理表单  即 http://www.cnblogs.com/linghaoxinpian/p/6906298.html 下载本章 ...

  7. Docker构建nginx+uwsgi+flask镜像(二)

    Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...

  8. python 10月30日复习

    1.把一个数字的list从小到大排序,然后写入文件,然后从文件中读取出来文件内容,然后反序,在追加到文件的下一行中 import codecs list1 = [2,23,8,54,86,12] li ...

  9. Spring 各种注解备注

    Spring 各种注解备注 felix_feng 关注 2016.12.28 10:34* 字数 2092 阅读 790评论 0喜欢 6 转载 (http://blog.csdn.net/sudilu ...

  10. 【Divided Two】cpp

    题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, ...