搭建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 ...
随机推荐
- FZU 2086 餐厅点餐(模拟)
Problem 2086 餐厅点餐 Problem Description Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜. 在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜. 为了保证膳食 ...
- 各类数据库url
msql: jdbc:mysql://127.0.0.1:3306/databaseName ms-sql jdbc:microsoft:sqlserver://127.0.0.1:1433;Data ...
- angular-ui-bootstrap插件API - Tabs
Tabs 案例 <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> ...
- dwr推送技术深入研究
DWR 工作原理: 是通过动态把 Java 类生成为 Javascript.它的代码就像 Ajax 一样,你感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端,DWR 负责数据的传递和转换. ...
- myeclipse的一些优化设置
注:本文内容复制于little_paper的博客,具体链接为http://little-paper.iteye.com/blog/1670745,感谢little_paper的分享,为便于能随时学习, ...
- iOS 消息推送证书生成方法的简单说明
openssl x509 -in idp.flowtreasure.cer -inform der -out PushChatCert.pem openssl pkcs12 -nocerts -out ...
- ios监听ScrollView/TableView滚动的正确姿势
主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scr ...
- HTML a标签 target属性作用
特殊的目标 有 4 个保留的目标名称用作特殊的文档重定向操作: _blank 浏览器总在一个新打开.未命名的窗口中载入目标文档. _self 这个目标的值对所有没有指定目标的 <a> 标签 ...
- [转] windows 上用程序putty使用 ssh自动登录Linux(Ubuntu)
需求: 在Win7电脑上使用putty(一种ssh客户端)连接Ubuntu 工具: puttygen.exe 和 putty.exe 第一步:生成密匙 运行puttygen.exe,选择需要的密匙类型 ...
- ResScope (软件资源分析)V1.94 绿色版
软件名称:ResScope (软件资源分析)V1.94 绿色版软件类别:国产软件运行环境:Windows软件语言:简体中文授权方式:免费版软件大小:1.47 MB软件等级:整理时间:2015-01-0 ...