搭建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 ...
随机推荐
- 一步步优化JVM四:决定Java堆的大小以及内存占用
到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java ...
- FZU 2088 最长队名
Problem 2088 最长队名 Problem Description Jack所在的班级决定组团报名参加FZU校赛.为了体现班级的团结和睦,班长决定用班级所有人的名字连起来组成一个史上最长最醒 ...
- [kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads
给一个n个点的完全图 再给你m条道路已经修好 问你还需要修多长的路才能让所有村子互通 将给的m个点的路重新加权值为零的边到边集里 然后求最小生成树 #include<cstdio> #in ...
- ECMAScript6之String类型的扩展
String类型的扩展 模板字符串 模板字符串是字符串的增强版,既可以当做普通的字符串使用,也可以在字符串中嵌入变量,它用反引号`来表示. //普通字符串 `In javascript '\n' is ...
- iOS UIImageView自适应图片大小
窗口大小获取: CGRect screenBounds = [ [UIScreenmainScreen]bounds];//返回的是带有状态栏的Rect CGRect rect = [ [UIScre ...
- Gs_Class._BaseQueryWeb查询页面基类(aspx.net)
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web; ...
- Zeppelin使用报错
报错信息: INFO [2016-11-03 17:05:08,481] ({pool-2-thread-2} SchedulerFactory.java[jobFinished]:137) - Jo ...
- Elasticsearch 快照和恢复
摘要: 在Elasticsearch中的可以创建快照,它创建单个索引或整个群集到一个远程的存储库中.在以前的版本中,系统只支持共享存储的快照创建,最新的版本可以通过插件支持更多的方式.在执行快照操作前 ...
- java学习开题
- OGC 的WCS WFS 及WMS 服务
OGC--Open Geospatial Consortium--开放地理信息联盟,是一个非盈利的志愿的国际标准化组织,引领着空间地理信息标准及定位基本服务的发展目前在空间数据互操作领域,基于公共接口 ...