码迷,mamicode.com
首页 > 编程语言 > 详细

【C语言】平衡二叉树

时间:2018-05-23 20:47:58      阅读:376      评论:0      收藏:0      [点我收藏+]

标签:img   ali   概念   语言   balance   tree   因子   .com   strong   

AVL树简介

AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。

平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。

一棵AVL树有如下必要条件:

 

• 条件一:它必须是二叉查找树。

• 条件二:每个节点的左子树和右子树的高度差至多为1。

技术分享图片

图一中左边二叉树的节点45的左孩子46比45大,不满足二叉搜索树的条件,因此它也不是一棵平衡二叉树。
右边二叉树满足二叉搜索树的条件,同时它满足条件二,因此它是一棵平衡二叉树。

 

技术分享图片

左边二叉树的节点45左子树高度2,右子树高度0,左右子树高度差为2-0=2,不满足条件二;
右边二叉树的节点均满足左右子树高度差至多为1,同时它满足二叉搜索树的要求,因此它是一棵平衡二叉树。

AVL树的查找、插入、删除操作在平均和最坏的情况下都是O(logn),这得益于它时刻维护着二叉树的平衡。如果我们需要查找的集合本身没有顺序,在频繁查找的同时也经常的插入和删除,AVL树是不错的选择。不平衡的二叉查找树在查找时的效率是很低的,因此,AVL如何维护二叉树的平衡是我们的学习重点。

 

 

AVL树相关概念

1. 平衡因子:将二叉树上节点的左子树高度减去右子树高度的值称为该节点的平衡因子BF(Balance Factor)。
    在图二右边的AVL树上:
    节点50的左子树高度为3,右子树高度为2,BF= 3-2 = 1;
    节点45的左子树高度为2,右子树高度为1,BF= 2-1 = 1;
    节点46的左子树高度为0,右子树高度为0,BF= 0-0 = 0;
    节点65的左子树高度为0,右子树高度为1,BF= 0-1 = -1;
    对于平衡二叉树,BF的取值范围为[-1,1]。如果发现某个节点的BF值不在此范围,则需要对树进行调整。

2. 最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树.。

技术分享图片

 在图三中,左边二叉树的节点45的BF = 1,插入节点43后,节点45的BF = 2。节点45是距离插入点43最近的BF不在[-1,1]范围内的节点,因此以节点45为根的子树为最小不平衡子树。

 

 

 

AVL树失衡调整(LL型调整)

节点的插入或删除都有可能导致AVL树失去平衡,因此,失衡调整是插入与删除操作的基础。
AVL树的失衡调整可以分为四种情况,我们逐一分析。
假设我们要为数组a[]={4,5,6,3,2,8,7,0,1}构建一棵AVL树。

 

情况一:左单旋转

首先插入{4,5,6},在插入元素6后出现不平衡的情况:

技术分享图片

当我们在右子树插入右孩子导致AVL失衡时,我们需要进行单左旋调整。旋转围绕最小失衡子树的根节点进行。
在删除新节点时也有可能会出现需要单左旋的情况。
左旋代码如下:

 

情况二:右单旋转

我们继续插入元素{3,2},此时二叉树为:

技术分享图片

插入3、2后出现了不平衡的情况。此时的插入情况是“在左子树上插入左孩子导致AVL树失衡”,我们需要进行单右旋调整。
单右旋代码为:

 

【C语言】平衡二叉树

标签:img   ali   概念   语言   balance   tree   因子   .com   strong   

原文地址:https://www.cnblogs.com/sunbines/p/9078773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!