平衡二叉树DSW算法
#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算法的更多相关文章
- 二叉查找树的平衡(DSW算法)
树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度O(log(N)),而链表为O(N),但理想情况指的是什么情况呢?一般指树是完全 ...
- 平衡二叉树---Shaolin
Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temp ...
- B树索引
在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能高.在OLAP中尤其明显,要完全理解索引的 ...
- 树的平衡之AVL树——错过文末你会后悔,信我
学习数据结构应该是一个循序渐进的过程: 当我们学习数组时,我们要体会数组的优点:仅仅通过下标就可以访问我们要找的元素(便于查找). 此时,我们思考:假如我要在第一个元素前插入一个新元素?采用数组需要挪 ...
- [数据结构 - 第6章] 树之二叉平衡树(C语言实现)
一.什么是平衡二叉树? 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两 ...
- 二叉树、B树、B+树、B*树、VAL树、红黑树
二叉搜索树 每个节点只存储一个关键字, 每个节点最多有两个子节点, 左子节点存储的关键字小于本节点存储的关键字 右子节点存储的关键字大于本节点存储的关键字 搜索时,从根节点开始搜索,小于走左结点,大于 ...
- JavaSE-万字长文-加载时间长-小白文
Java语法规范 所有的Java语句必须以;结尾! 无论是().[]还是{},所有的括号必须一一匹配! 主方法的代码只能写在{}中! Java基础语法(面向过程) 在学习面向对象之前,我们需要了解面向 ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- 数据结构与算法--从平衡二叉树(AVL)到红黑树
数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...
随机推荐
- R-描述性统计
RT...老实说这一章我是抖的...但是,加油- # 从1:100中均匀抽取size个数据,replace=TRUE指有放回抽样,数据可以重复 x = sample(1:100, size = 100 ...
- linux通用GPIO驱动,写GPIO文件不立即生效问题解决
Linux开发平台实现了通用GPIO的驱动,用户通过,SHell或者系统调用能控制GPIO的输出和读取其输入值.其属性文件均在/sys/class/gpio/目录下,该目录下有export和unexp ...
- c语言可变参数函数
c语言支持可变参数函数.这里的可变指,函数的参数个数可变. 其原理是,一般情况下,函数参数传递时,其压栈顺序是从右向左,栈在虚拟内存中的增长方向是从上往下.所以,对于一个函数调用 func(int a ...
- 笔记-python-standard library-11.2 os.path
笔记-python-standard library-11.2 os.path 1. os.path Source code: Lib/posixpath.py (for POSIX), L ...
- 将list中的元素按照属性分类成树状的map
技术交流群: 233513714 public LinkedHashMap<String, List<TPhoneModel>> queryPhoneList(List< ...
- javascript数组&省市联动分别用js数组和JSON实现
1.定义数组的三种方式: **数组可以存放不同的数据类型 第一种: var arr=[1,2,3]; var arr=[1,"2",true]; 第二种: 使用内置对象 ...
- 如何在 Eclipse 中使用插件构建 PHP 开发环境[转]
原文出处: http://hykloud.com/2012/03/08/information_technology/how-setup-eclipse-php-pdt-remote-system-e ...
- 剑指Offer - 九度1514 - 数值的整数次方
剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...
- 《Cracking the Coding Interview》——第17章:普通题——题目8
2014-04-28 23:35 题目:最大子数组和问题. 解法:O(n)解法. 代码: // 17.8 Find the consecutive subarray with maximum sum ...
- 油田(DFS)
//DFS:油田问题 #include <iostream> using namespace std; ][]; int n,m; //一个网格的8个方向 ][] = {{-,-},{-, ...