#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. thinkphp5控制器向+vue的data里传值

    传一维数组传值 $array=['id'=>40,"cat_name"=>"明星产品"]; $MenuCats_info=json_encode($ ...

  2. Educational Codeforces Round 37 E. Connected Components?(图论)

    E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. 一行代码将两个列表拼接出第三个列表(两个可迭代对象相加产生第三个可迭代对象)--map()方法

    map()方法 map(func, *iterables) --> map object lambda方法: lambda  参数 :返回值 a = map(',7]) print(list(a ...

  4. WPF点击不同界面上的按钮实现界面切换

    原文:WPF点击不同界面上的按钮实现界面切换 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_29844879/article/details/ ...

  5. Kafka消费分组和分区分配策略

    Kafka消费分组,消息消费原理 同一个消费组里的消费者不能消费同一个分区,不同消费组的消费组可以消费同一个分区 Kafka分区分配策略 在 Kafka 内部存在两种默认的分区分配策略:Range 和 ...

  6. Java 虚拟机结构分析

    本博文主要介绍了JVM(Java Virtual Machine)的组成部分以及它们内部的工作机制和原理.需要注意的是,虽然平时我们用的大多是Sun(现已被Oracle收购)JDK提供的JVM,但是J ...

  7. equals和toString

    Object的equals方法默认比较地址值.所以当需要比较两个对象的内容时需要重写equals方法.

  8. 《Cracking the Coding Interview》——第17章:普通题——题目7

    2014-04-28 23:28 题目:给定一个数字,用英语把它读出来. 解法:ZOJ上有相反的题目.如果我要用中文读书来呢? 代码: // 17.7 Read an integer in Engli ...

  9. nginx配置及HTTPS配置示例

    一.nginx简单配置示例 user www www; worker_processes ; #error_log logs/error.log; #error_log logs/error.log ...

  10. JMeter学习笔记(九) 参数化2--CSV Data Set Config

    2.CSV Data Set Config 1)添加 CSV Data Set Confi 2)配置CSV Data Set Config 3)添加HTTP请求,引用参数,格式 ${} 4)执行HTT ...