zoukankan      html  css  js  c++  java
  • 平衡二叉树及其应用场景

     昨天腾讯面试把平衡二叉树当做排序二叉树,绝对遭歧视了,汗...

    平衡二叉树简称平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树。他的定义非常easy,就是若一棵二叉树的每一个左右节点的高度差最多相差1,此二叉树即是平衡二叉树。把二叉树的每一个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子仅仅能是1、0或者-1。

    平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺点就是,树的结构是无法预料的,任意性非常大,它仅仅与节点的值和插入的顺序有关系,往往得到的是一个不平衡的二叉树。在最坏的情况下,可能得到的是一个单支二叉树,其高度和节点数同样,相当于一个单链表,对其正常的时间复杂度有O(lb n)变成了O(n),从而丧失了二叉排序树的一些应该有的长处。

    当插入一个新的节点的时候,在普通的二叉树中不用考虑树的平衡因子,仅仅要将大于根节点的值插入到右子树,小于节点的值插入到左子树,递归就可以。而在平衡二叉树则不一样,在插入节点的时候,假设插入节点之后有一个节点的平衡因子要大于2或者小于-2的时候,他须要对其进行调整,如今仅仅考虑插入到节点的左子树部分(右子树与此同样)。主要分为下面三种情况:

    (1)若插入前一部分节点的左子树高度和右子树高度相等,即平衡因子为0,插入后平衡因子变为1,仍符合平衡的条件不用调整。

    (2)若插入前左子树高度小于右子树高度,即平衡因子为-1,则插入后将使平衡因子变为0,平衡性反倒得到调整,所以不必调整。

    (3)若插入前左子树的高度大于右子树高度,即平衡因子为1,则插入左子树之后会使得平衡因子变为2,这种情况下就破坏了平衡二叉树的结构,所以必须对其进行调整,使其加以改善。

    调整二叉树首先要明确一个定义,即最小不平衡子树。最小不平衡子树是指以离插入节点近期、且平衡因子绝对值大于1的节点做根的子树。

    以下解说平衡二叉树最主要的4种调整操作,调整的原则是调整后他的搜索二叉树的性质不变,即树的中序遍历是不会改变的:

    1. LL型调整。在B点的左子树上插入一个节点。插入后B点的左子树的平衡因子变为1,A节点的平衡因子变为了2。这样能够看出来A节点为根节点的子树是最小不平衡子树。调整时,将A的左孩子B向右旋转取代A称为原来不平衡子树的根节点,将A的节点右下旋转称为B的右子树的根节点,而B的原右子树变为A的左子树。具体步骤例如以下图:

    2. RR型调整操作

    在A节点的右孩子的右子树上插入节点,使得A节点的平衡因子由-1变为-2而引起的不平衡所进行的调整操作。调整操作大致一样,看图就能够明确了。

     

    3. LR型的调整操作。在A节点的左孩子的右子树上插入节点,使得A节点的平衡因子由1变为了2而引起的不平衡所进行的调整的操作。调整过程如图:

    4. RL型的调整操作。不多说了,直接上图:

    在二叉搜索树的插入和删除运算中,採用平衡树的长处是:使树的结构较好,从而提高查找运算的速度。缺点是:是插入和删除运算变得复杂化,从而减少了他们的运算速度。对二叉搜索树删除节点而引起的不平衡性进行的操作比插入节点的情况要复杂,在此就不再论述了。


  • 相关阅读:
    23. 霍纳法则(多项式求值快速算法)
    22. 欧几里德算法(求最大公约数GCD)
    [poj 2106] Boolean Expressions 递归
    [poj 1185] 炮兵阵地 状压dp 位运算
    [MOOC程序设计与算法二] 递归二
    [poj 3254] Corn Fields 状压dp
    [hdu 1074] Doing Homework 状压dp
    [hdu 1568] Fibonacci数列前4位
    [haut] 1281: 邪能炸弹 dp
    [hdu 2604] Queuing 递推 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4033094.html
Copyright © 2011-2022 走看看