#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. vue 点击当前元素添加class 去掉兄弟的class

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  2. Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)

    传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...

  3. python-10多进程

    1-多进程(multiprocessing), 1个父进程可以有多少子进程 1.1下面的例子演示了启动一个子进程并等待其结束 from multiprocessing import Process i ...

  4. perl连接mysql数据库

    首先需要安装 ppm install DBD::mysql use strict; use DBI; my $host = "localhost"; # 主机地址 my $driv ...

  5. 笔记-python lib-pymongo

    笔记-python lib-pymongo 1.      开始 pymongo是python版的连接库,最新版为3.7.2. 文档地址:https://pypi.org/project/pymong ...

  6. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

  7. Docker容器 - 容器时间跟宿主机时间同步

    在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,这就需要同步它们的时间,让容器时间跟宿主机时间保持一致. 转载自:https://www.cnblogs.com/kevingrac ...

  8. Javacript实现倒计时

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

  9. react事件处理及动态样式添加

    多数据的事件绑定,循环数据来进行绑定.如下方式就是循环绑定事件的基本代码: this.state.lists.map(function(value,index,array){//代码片段}.bind( ...

  10. 使用Visual Studio 快速把 Json,Xml 字符串创建为一个实体类