平衡二叉树DSW算法
2016-09-27 11:15
295 查看
#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; }
相关文章推荐
- 数据链路层的协议分析
- Debian GNU/Linux “Jessie” 最新版问世了
- 【笔记】160927 块/类型范围/枚举类型/变量初始化/extern
- istream_iterator、ostream_iterator 使用初探
- Linux入门学习教程:GNU C及将Vim打造成C/C++的半自动化IDE
- 内部排序之归并排序(MergingSort)
- AsyncTask源码解析
- iOS代码重构
- iOS开发:TextField随着键盘的弹出上移
- JNDI
- Android图片特效处理(像素处理)
- oracle新建表空间及用户
- ARM初学引导_转
- QLinkedList 类用法
- 什么时候才能恢复我学习的心...
- window 环境 非归档模式下,rman 异机迁移数据
- .NET MVC 时间格式View显示问题
- PHP基于GD库的图像处理方法小结
- 《Java》----详解用apache的commons-fileupload组件实现文件上传
- python读取xml文件