AVL的插入过程
2015-08-20 16:59
337 查看
#include<iostream> #include<algorithm> using namespace std; #define ElementType int typedef struct AVLTreeNode { ElementType Data; AVLTreeNode* Left; AVLTreeNode* Right; int height; }*AVLTree; int GetHeight(AVLTree T) { if (T == NULL) return 0; else return max(GetHeight(T->Left), GetHeight(T->Right))+1; //return T->height; } AVLTree SingleLeftRotation(AVLTree T) { AVLTree p = T->Left; T->Left = p->Right; p->Right = T; T->height = max(GetHeight(T->Left), GetHeight(T->Right)) + 1; p->height = max(GetHeight(p->Left), T->height) + 1; return p; } AVLTree SingleRightRotation(AVLTree T) { AVLTree p = T->Right; T->Right = p->Left; p->Left = T; T->height = max(GetHeight(T->Left), GetHeight(T->Right)) + 1; p->height = max(GetHeight(p->Left), GetHeight(p->Right))+ 1; return p; } AVLTree DoubleLeftRightRotation(AVLTree T) { T->Left = SingleRightRotation(T->Left); return SingleLeftRotation(T); } AVLTree AVL_Insertion(ElementType x, AVLTree T) { if (T == NULL) { T = (AVLTree)malloc(sizeof(AVLTreeNode)); T->Data = x; T->height = 0; T->Left = T->Right = NULL; } else if (x < T->Data) { T->Left=AVL_Insertion(x, T->Left); if (GetHeight(T->Left) - GetHeight(T->Right) == 2) { if (x < T->Left->Data)//左左 { T = SingleLeftRotation(T); } else //左右 { T = DoubleLeftRightRotation(T); } } } else if (x>T->Data) { T->Right = AVL_Insertion(x, T->Right); if (GetHeight(T->Left) - GetHeight(T->Right) == -2) { if (x > T->Right->Data) T = SingleLeftRotation(T); else T = DoubleLeftRightRotation(T); } } T->height = max(GetHeight(T->Left), GetHeight(T->Right)) + 1; return T; } void PreOrderTraversal(AVLTree T) { if (T) { printf("%d ", T->Data); PreOrderTraversal(T->Left); PreOrderTraversal(T->Right); } } int main() { AVLTree T = NULL; T=AVL_Insertion(564, T); T=AVL_Insertion(460,T); T=AVL_Insertion(546, T); PreOrderTraversal(T); return 0; }
相关文章推荐
- 虚拟化--038 vsphere ESXI升级方法
- 约瑟夫问题的Python和C++求解方法
- JQuery中,.val()与 .attr("","");的区别,以及placeholder与value冲突
- android 自定义TextView"会发脾气的TextView"
- iOS博客地址,很多资料
- python开发之Tkinter可视化
- MyBatis/Ibatis中#和$的区别
- HDU 1029.Ignatius and the Princess IV【数据弱鸡】【咦,水题!】【8月20】
- mac电脑jdk版本切换
- DOM(二)-07-DOM(示例-创建表格)
- ubuntu下安装numpy,matplotlib
- android 自定义TextView"会发脾气的TextView"
- 《AndroidStudio每日一贴》3.快速切换代码风格、配色方案和键盘
- PHP中正则表达式学习及应用(一)
- MAC 版 sublime text 2 安装插件管理器
- 虚拟化--037 vsphere 更改vsphere client和vsphere web client登陆语言
- iOS在进行网络请求的时候的网络状态的响应的判断
- 视图中order by 的使用
- tomcat7.0.63 (redis session方案)
- CentOS修改MySql数据库目录datadir