1、What is AVL tree?

AVL tree 是一种特殊的二叉查找树,,首先我们要在树中引入平衡因子balance,表示结点右子树的高度减去左子树的高度差(右-左),对于一棵AVL树要么它是一棵空树,要么它是一棵高度平衡的二叉查找树,平衡因子balance绝对值不超过1

                                   

非平衡的二叉查找树                                                            平衡的二叉查找树

根据定义,任意结点的平衡因子只能取-1、0、1

AVL搜索算法复杂度为log(n)

2、AVL树的插入

在向一棵AVL树中插入一个新结点时,如果树中某个结点的平衡因子的绝对值|balance|>1,则出现了不平衡,需要做平衡化处理。

在插入的位置可能要进行平衡旋转

每插入一个新结点时,AVL树中相关结点的平衡状态发生改变,因此,在插入一个新结点后,需要从插入位置沿通向根的路径回溯,检查各结点的平衡因子。

(1)右单旋转

(盗图)

插入了结点2,AVL树失衡了,现在要通过右单旋转将其化为AVL树

以结点3为旋转轴,将结点2与结点5顺时针旋转

将3变为根,5变为叶子节点

转后结果:

  1. //右单旋转
  2. void R_Rotate(BSTree &p)
  3. {
  4. BSTree rc;
  5. rc=p->lchild;
  6. p->lchild=rc->rchild;
  7. rc->rchild=p;
  8. p=rc;
  9. }

  

(2)左单旋转

与右单旋转类似

算法

  1. //左单旋转
  2. void L_Rotate(BSTree &p)
  3. {
  4. BSTree lc;
  5. lc=p->rchild;
  6. p->rchild=lc->lchild;
  7. lc->lchild=p;
  8. p=lc;
  9. }

 

(3)双旋转

如果是如下方式插入那么怎么办呢?

(盗图)

很明显的是单用左单旋转与右单旋转是无法解决问题的

要用左单与右单结合来做

对于上图中的情况先左旋在右旋

左旋:

其实就是化为能够进行右旋的形式

右旋:

3、分析

失去平衡的最小子树的根结点必然离插入结点最近,平衡因子的绝对值在插入之前大于0

(1)在查找S结点的插入位置过程中,记录与S结点最近,且平衡因子不等于零的结点a

(2)修改自a到S的路径上所有结点的平衡因子

(3)判断树是否出现不平衡,即a的平衡因子是否大于1

(4)若出现不平衡,进行平衡调整

AVL树 高度平衡的二叉查找树的更多相关文章

  1. AVL树(平衡二叉查找树)

    首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树 ...

  2. AVL树 & 重平衡概念

    AVL树是有平衡条件的二叉搜索树.这个平衡条件必须容易保持,而且需要保证树的深度是O(logN). AVL=BBST 作为二叉搜索树的最后一部分,我们来介绍最为经典的一种平衡二叉搜索树:AVL树.回顾 ...

  3. 判断AVL树是否平衡

    AVL树是高度的平衡二插搜索树,其左子树和右子树的高度之差不超过1(树中的左子树和右子树都是AVL树),维持这个高度之差就要控制它的平衡因子.那么判断一颗AVL树是否平衡就需要判断它的左子树和右子树高 ...

  4. AVL树的平衡算法(JAVA实现)

      1.概念: AVL树本质上还是一个二叉搜索树,不过比二叉搜索树多了一个平衡条件:每个节点的左右子树的高度差不大于1. 二叉树的应用是为了弥补链表的查询效率问题,但是极端情况下,二叉搜索树会无限接近 ...

  5. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

  6. 算法-搜索(3)AVL树

    AVL树高度平衡的二叉搜索树,任一点的平衡印章只能是+1.-1.0,从而尽量降低树的高度. 如果它有n个结点,高度可保持在O(log2n),平均搜索长度也可保持在O(log2n). (1)AVL树的插 ...

  7. 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树

    一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...

  8. 二叉查找树(BST)、平衡二叉树(AVL树)(只有插入说明)

    二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点, ...

  9. 二叉查找树(BST)、平衡二叉树(AVL树)

    二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域,右 ...

随机推荐

  1. PHP判断一个变量是否可以通过foreach进行遍历

    <?php if( !is_array( $items ) && !$items instanceof Traversable ) //Throw exception here ...

  2. 超赞网页背景效果-canvas-nest.js

    canvas-nest.js 是 canvas 上绘制的蜂窝状网站背景. 引入的时候的注意事项:js加载的时候需要保证body已经加载: 一个简单的demo: <!DOCTYPE html> ...

  3. [转]奇异值分解(We Recommend a Singular Value Decomposition)

    原文作者:David Austin原文链接: http://www.ams.org/samplings/feature-column/fcarc-svd译者:richardsun(孙振龙) 在这篇文章 ...

  4. get与post请求

    1.post请求 如果表单以Post方式提交过来的,接收时必须以Requert.Form来接收,并且表单元素必须有name属性,而Form指定的键的名称就是name属性的值 <form meth ...

  5. 人工手动冷备不完全恢复介绍(purge表不完全恢复)

    不完全恢复不完全恢复的基本类型:1)基于时间点 (until time): 使整个数据库恢复到过去的一个时间点前2)基于scn (until change): 使整个数据库恢复到过去的某个SCN前3) ...

  6. CodeForces 711A Bus to Udayland

    简单题. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inclu ...

  7. 关于Trie Tree简单实现

    最近突然有兴致hiho一下了,实现了下trie tree,感觉而言,还是挺有意思的,个人觉得这货不光可以用来查单词吧,其实也可以用来替代Hash,反正查找,插入复杂度都挺低的,哈哈,啥都不懂,瞎扯.. ...

  8. bone collector hdu 01背包问题

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  9. 【Time系列一】datetime的妙用

    今天在弄个自动关机小脚本的时候,遇到了时间转换的问题,也难怪,以前没学过, 不能怪我不会哦! 首先,先学会打印出当前时间的几种方式 参考开源社区:  http://my.oschina.net/u/1 ...

  10. 打开myeclipse2014的包资源管理器

    网上查到的方法不太适用于myeclipse2014,我就自己试了一下下 结果是:windows->show view->general->project package 结果: 希望 ...