搭建AVL树
#include<iostream>
using namespace std; struct TreeNode
{
int height; //每一个结点都要保存自己的高度
int data;
TreeNode* leftC;
TreeNode* rightC;
}; //得到此时结点高度
int getHeight(TreeNode* s)
{
if (s != NULL)
{
return s->height;
}
return -1;
} //右旋
void rightRotate(TreeNode*& root)
{
TreeNode *l1 = root;
TreeNode *l2 = root->leftC;
l1->leftC = l2->rightC;
l2->rightC = l1;
l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1;
l2->height = (getHeight(l2->leftC) > getHeight(l2->rightC) ? getHeight(l2->leftC) : getHeight(l2->rightC)) + 1;
root = l2;
} //左旋
void leftRotate(TreeNode*& root)
{
TreeNode *l1 = root;
TreeNode *l2 = root->rightC;
l1->rightC = l2->leftC;
l2->leftC = l1;
l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1;
l2->height = (getHeight(l2->leftC) > getHeight(l2->rightC) ? getHeight(l2->leftC) : getHeight(l2->rightC)) + 1;
root = l2;
} //左右,先左旋,再右旋
void DoubleRotateLR(TreeNode* &n1)
{
leftRotate(n1->leftC);
rightRotate(n1);
} //右左,先右旋,后左旋
void DoubleRotateRL(TreeNode* &n1)
{
rightRotate(n1->rightC);
leftRotate(n1);
} void Insert(TreeNode** node, int data)
{
if (*node == NULL)
{
TreeNode* tmp = new TreeNode();
tmp->data = data;
tmp->height = 0;
tmp->leftC = NULL;
tmp->rightC = NULL;
*node = tmp;
return;
}
if ((*node)->data > data)//结点的值大于data
{
Insert(&((*node)->leftC), data);//不断插入 if ((getHeight((*node)->leftC) - getHeight((*node)->rightC)) == 2)
{//说明需要右旋
if (data < (*node)->leftC->data)
{
rightRotate(*node);
}
else
{
DoubleRotateLR(*node);
}
} }
else if ((*node)->data < data)//没有相同的值
{
Insert(&((*node)->rightC), data);
//如果高度之差为2的话就失去了平衡,需要旋转
if (2 == getHeight((*node)->rightC) - getHeight((*node)->leftC))
{
if (data > (*node)->rightC->data)
{
leftRotate(*node);
}
else
{
DoubleRotateRL(*node);
}
}
} (*node)->height = (getHeight((*node)->leftC) > getHeight((*node)->rightC) ? getHeight((*node)->leftC) : getHeight((*node)->rightC)) + 1;
} void preOrder(TreeNode* node)
{
if (node == NULL)
{
return;
}
cout << node->data << " ";
preOrder(node->leftC);
preOrder(node->rightC);
} void inOrderTraversal(TreeNode* root)
{
if(root)
{
inOrderTraversal(root->leftC);
cout << root->data << " ";
inOrderTraversal(root->rightC);
}
} int main()
{
int n;
cin>>n;
while(n-->0)
{
int num;
cin>>num; TreeNode *head=NULL; int point; for(int i=0;i<num;i++)
{
cin>>point;
Insert(&head, point);
} preOrder(head);
cout<<endl;
inOrderTraversal(head);
cout<<endl;
} return 0;
}
搭建AVL树的更多相关文章
- 算法与数据结构(十一) 平衡二叉树(AVL树)
		今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ... 
- AVL树原理及实现(C语言实现以及Java语言实现)
		欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ... 
- AVL树
		AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ... 
- AVL树的平衡算法(JAVA实现)
		1.概念: AVL树本质上还是一个二叉搜索树,不过比二叉搜索树多了一个平衡条件:每个节点的左右子树的高度差不大于1. 二叉树的应用是为了弥补链表的查询效率问题,但是极端情况下,二叉搜索树会无限接近 ... 
- 【数据结构】平衡二叉树—AVL树
		(百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ... 
- 数据结构图文解析之:AVL树详解及C++模板实现
		0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ... 
- 数据结构之平衡二叉树(AVL树)
		平衡二叉树(AVL树)定义如下:平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树: (1)它的左子树和右子树的高度之差绝对值不超过1: (2)它的左子树和右子树都是平衡二叉树. AVL树避免了 ... 
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
		03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ... 
- 论AVL树与红黑树
		首先讲解一下AVL树: 例如,我们要输入这样一串数字,10,9,8,7,15,20这样一串数字来建立AVL树 1,首先输入10,得到一个根结点10 2,然后输入9, 得到10这个根结点一个左孩子结点9 ... 
随机推荐
- linux环境下搭建环境发布web项目
			在公司真是学习了一下项目环境在linux下搭建和发布的过程,这是每个程序员都应该掌握的一个技能,将整理下为以后温习用,也乐于和为掌握这些技能的猿分享: 这里主要分为5部分:1.安装jdk,并配置环境变 ... 
- sublime text3  用法
			1. 使用lint进行语法及风格校验 jshint可以统一编码风格. 安装jshint的步骤: 1)ctrl+shift+p打开命令模式--->输入pcip回车--->输入sublimel ... 
- 安卓平台多个视频叠加演示demo说明
			多个音视频编辑演示说明: 第一个-----字幕和视频的叠加: 说明: 把字幕文件中的文字,按照时间叠加到视频上去,形成新的视频. 类似我们看电影时的字幕. 下载地址:http://www.cnblog ... 
- Firewalld防火墙
			Firewalld服务是红帽RHEL7系统中默认的防火墙管理工具,特点是拥有运行时配置与永久配置选项且能够支持动态更新以及"zone"的区域功能概念,使用图形化工具firewall ... 
- iOSAPP添加启动页
			如果你在开发过程中出现屏幕显示内容比例不正常或者显示不全的问题,你发现不是代码或者约束的问题,那么很可能是启动页没有添加或者添加不全的原因,下面配一张问题图片上下黑屏 添加启动页步骤如下图 (1) ( ... 
- Asp.Net BulletedList使用及详解
			BulletedList使用及详解 文章来源:www.cnblogs.com/xiohao/archive/2013/10/09/3359263.html BulletedList是一个让你轻松在 ... 
- 4天html总结
- EBS FORM FOLDER 开发,单元格无法使用右键
			问题描述: 在使用folder开发FORM后,单元格无法使用右键,正常应该可以右键进行隐藏.显示.复制等操作. 通过对比发现是因ITEM属性中 弹出式菜单未设置导致. 解决方法: 设置弹出式菜单 
- 转 错误:ORA-28002: the password will expire within 7 days 解决方法
			今天在使用sqlplus时出现 =============================================== ERROR:ORA-28002: the password will e ... 
- java学习 (2)xml操作 SAX(增、删、改、查)
			sax是事件驱动的,sax是一种推模式 SAX常用事件: startDocument()----文档开始事件 startElement()-----元素开始事件 charElement()----文本 ... 
