数据结构与算法问题 AVL二叉平衡树
AVL树是带有平衡条件的二叉查找树。
这个平衡条件必须保持,并且它必须保证树的深度是O(logN)。
一棵AVL树是其每一个节点的左子树和右子树的高度最多差1的二叉查找树。
(空树的高度定义为-1)。
在插入以后。仅仅有那些从插入点到根节点的路径上的节点的平衡可能被改变,由于仅仅有这些节点的子树可能发生变化。当我们沿着这条路径上行到根并更新平衡信息时。我们能够找到一个节点,它的新平衡破坏了AVL条件。我们将指出怎样在第一个这种节点(即最深的节点)又一次平衡这棵树,并证明,这一又一次平衡保证整个树满足AVL特性。
让我们把必须又一次平衡的这个节点叫做a。因为随意节点最多有两个儿子,因此高度不平衡时。a点的两棵子树的高度差2。easy看出,这样的不平衡可能出如今以下四种情况中:
1.对a的左儿子的左子树进行一次插入
2.对a的左儿子的右子树进行一次插入
3.对a的右儿子的左子树进行一次插入
4.对a的右儿子的右子树进行一次插入
第一种情况是插入发生在“外边"的情况(即左—左的情况或右—右的情况)。该情况通过对树的一次单旋转而完毕调整。另外一种情况是插入发生在”内部“的情形(即左—右的情况或右—左的情况),该情况通过略微复杂些的双旋转来处理。
AVL树本质上还是一棵二叉搜索树,它的特点是:
本身首先是一棵二叉搜索树。
带有平衡条件:每一个结点的左右子树的高度之差的绝对值(平衡因子)最多为1
#include <iostream>
using namespace std;
const int LH = 1;
const int EH = 0;
const int RH = -1;
bool TRUE = 1;
bool FALSE = 0; typedef struct BSTNode
{
int key;
int bf;
BSTNode *lchild, *rchild;
}BSTNode; //中序遍历
void inordertree(BSTNode * &root)
{
if (root)
{
inordertree(root->lchild);
cout << root->key<<",";
inordertree(root->rchild);
}
} //前序遍历
void preordertree(BSTNode * &root)
{
if (root)
{
cout << root->key<<",";
preordertree(root->lchild);
preordertree(root->rchild);
}
}
//右旋
void R_Rotate(BSTNode * &p)
{
BSTNode *lc = p->lchild;
p->lchild = lc->rchild;
lc->rchild = p;
p = lc;
} //左旋
void L_Rotate(BSTNode *& p)
{
BSTNode *rc = p->rchild;
p->rchild = rc->lchild;
rc->lchild = p;
p = rc;
} void LeftBalance(BSTNode * &T)
{
BSTNode *lc = T->lchild;
switch (lc->bf)
{
case LH:
T->bf = lc->bf = EH;
R_Rotate(T);
break;
case RH:
BSTNode *rd = lc->rchild;
switch (rd->bf)
{
case LH:
T->bf = RH;
lc->bf = EH;
break;
case EH:
T->bf = lc->bf = EH;
lc->bf = LH;
break;
}
rd->bf = EH;
L_Rotate(T->lchild);//先左旋
R_Rotate(T);
break;
}
} void RightBalance(BSTNode *& T)
{
BSTNode *rc = T->rchild;
switch (rc->bf)
{
case RH:
T->bf = rc->bf = EH;
L_Rotate(T);
break;
case LH:
BSTNode *ld = rc->lchild;
switch (ld->bf)
{
case RH:
T->bf = LH;
rc->bf = EH;
break;
case EH:
T->bf = rc->bf = EH;
break;
case LH:
T->bf = EH;
rc->bf = RH;
break;
}
ld->bf = EH;
R_Rotate(T->rchild);
L_Rotate(T);
break; }
} int insertAVL(BSTNode *& t, int e, bool &taller)
{
if (!t)
{
t = new BSTNode;
t->key = e;
t->lchild = t->rchild = NULL;
t->bf = EH;
taller = TRUE; }
else
{
if (e == t->key)
{
taller = FALSE;
return 0;
}
if (e < t->key)
{
if (!insertAVL(t->lchild, e,taller))
return 0;
if (taller)
{
switch (t->bf)
{
case LH:
LeftBalance(t);
taller = FALSE;
break;
case EH:
t->bf = LH;
taller = TRUE;
break;
case RH:
t->bf = EH;
taller = FALSE;
break; }
}
}
else
{
if (!insertAVL(t->rchild, e, taller))
return 0;
if (taller)
{
switch (t->bf)
{
case RH:
RightBalance(t);
taller = FALSE;
break;
case EH:
t->bf = RH;
taller = TRUE;
break;
case LH:
t->bf = EH;
taller = FALSE;
break;
}
}
}
}
return 1;
} BSTNode *search(BSTNode *t, int key)
{
BSTNode *p = t;
while (p)
{
if (p->key == key)
return p;
else if (p->key < key)
p = p->rchild;
else
p = p->lchild;
}
return p;
} int main()
{
BSTNode *root = NULL;
BSTNode *r;
bool taller = FALSE;
int array[] = { 13, 24, 37, 90, 53 };
for (int i = 0; i < 5; i++)
insertAVL(root, array[i], taller);
cout << "inorder traverse..." << endl;
inordertree(root);
cout << endl;
cout << "preorder traverse..." << endl;
preordertree(root);
cout << endl;
cout << "search key..." << endl;
r = search(root, 37);
if (r)
{
cout << r->key << endl;
}
else
{
cout << "not find" << endl;
}
system("pause");
return 0;
}
数据结构与算法问题 AVL二叉平衡树的更多相关文章
- 算法题 19 二叉平衡树检查 牛客网 CC150
算法题 19 二叉平衡树检查 牛客网 CC150 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1. 给定指向树根结点的指针TreeNode* ro ...
- 数据结构与算法16—平衡二叉(AVL)树
我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2n)同时也由此而决定.但是,在某些极端的情况下(如在 ...
- AVL(二叉平衡树) 的实现
一颗AVL树是其每个节点的左子树与右子树的高度最多差1的二叉查找树. 在插入过程中,利用旋转的办法保持这个性质. 共分四种情形: 1. 树T的左孩子的左子树上新插入节点导致破坏平衡性: 如下图左边所 ...
- 从零开始学算法---二叉平衡树(AVL树)
先来了解一些基本概念: 1)什么是二叉平衡树? 之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数. 通常来讲是这样的, 但 ...
- AVL树(二叉平衡树)详解与实现
AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...
- Algorithms: 二叉平衡树(AVL)
二叉平衡树(AVL): 这个数据结构我在三月份学数据结构结构的时候遇到过.但当时没调通.也就没写下来.前几天要用的时候给调好了!详细AVL是什么,我就不介绍了,维基百科都有. 后面两月又要忙了. ...
- 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)
目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...
- java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)
package Demo; public class AVLtree { private Node root; //首先定义根节点 private static class Node{ //定义Nod ...
- 二叉平衡树AVL的插入与删除(java实现)
二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...
随机推荐
- Sqlserver添加加字段、删除字段、修改字段类型、修改字段名、修改字段默认值
参考:https://www.cnblogs.com/pangpanghuan/p/6432331.html 初始化表: --.添加字段 --1.1.为null alter table DataTab ...
- nodejs实现网站数据的爬取
// 引入https模块,由于我们爬取的网站采用的是https协议 const https = require('https'); // 引入cheerio模块,使用这个模块可以将爬取的网页源代码进行 ...
- Floyd算法简单实现(C++)
图的最短路径问题主要包括三种算法: (1)Dijkstra (没有负权边的单源最短路径) (2)Floyed (多源最短路径) (3)Bellman (含有负权边的单源最短路径) 本文主要讲使用C++ ...
- Spring AOP 详细介绍
一.理解 “面向切面编程” 面向切面编程(Aspect Oriented Programming,AOP)是软件编程思想发展到一定阶段的产物,是对面向对象编程(Object Oriented Prog ...
- Python工程师面试题目
1.请尽可能列举python列表的成员方法,并给出一下列表操作的答案: len() 返回列表中的元素数量. max() 返回列表中的最大元素.最大元素的判断依据是列表中的对象类型.数字列表中的最大元素 ...
- python和搜索
# -*- coding: UTF-8 -*- import re # 搜索逻辑 def querylogic(list): query = {} if len(list) > 1 or len ...
- ERP类系统设计学习
文章:分布式.服务化的ERP系统架构设计 文章的方法是对系统进行拆分,拆分成多个子系统.
- mysql免安装版配置使用
mysql免安装版配置使用 1.下载解压 2.配置环境变量 变量MYSQL_HOME = 解压目录 配置变量path 编辑,在后面加上 ;%MYSQL_HOME%\bin 3.修改配置文件 增加或 ...
- [NOIP1999] 提高组 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- BZOJ1573: [Usaco2009 Open]牛绣花cowemb
求半径d<=50000的圆(不含边界)内n<=50000条直线有多少交点,给直线的解析式. 一开始就想,如果能求出直线交点与原点距离<d的条件,那么从中不重复地筛选即可.然而两个kx ...