zoukankan      html  css  js  c++  java
  • 二叉查找树,平衡二叉树

    二叉查找树

    二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 

    二叉查找树可以任意地构造,也可以按照下图的方式来构造: 

    但是这棵二叉树的查询效率就低了。因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出新的定义——平衡二叉树,或称AVL树。

    平衡二叉树(AVL Tree)

    平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。

    如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡,这种失去平衡的二叉树可以概括为四种姿态:LL(左左)、RR(右右)、LR(左右)、RL(右左)。它们的示意图如下: 

    这四种失去平衡的姿态都有各自的定义: 
    LL:LeftLeft,也称“左左”。插入或删除一个节点后,根节点的左孩子(Left Child)的左孩子(Left Child)还有非空节点,导致根节点的左子树高度比右子树高度高2,AVL树失去平衡。

    RR:RightRight,也称“右右”。插入或删除一个节点后,根节点的右孩子(Right Child)的右孩子(Right Child)还有非空节点,导致根节点的右子树高度比左子树高度高2,AVL树失去平衡。

    LR:LeftRight,也称“左右”。插入或删除一个节点后,根节点的左孩子(Left Child)的右孩子(Right Child)还有非空节点,导致根节点的左子树高度比右子树高度高2,AVL树失去平衡。

    RL:RightLeft,也称“右左”。插入或删除一个节点后,根节点的右孩子(Right Child)的左孩子(Left Child)还有非空节点,导致根节点的右子树高度比左子树高度高2,AVL树失去平衡。

    AVL树失去平衡之后,可以通过旋转使其恢复平衡。下面分别介绍四种失去平衡的情况下对应的旋转方法。

    LL的旋转。LL失去平衡的情况下,可以通过一次旋转让AVL树恢复平衡。步骤如下:

    1. 将根节点的左孩子作为新根节点。
    2. 将新根节点的右孩子作为原根节点的左孩子。
    3. 将原根节点作为新根节点的右孩子。

    LL旋转示意图如下: 
    索引

    RR的旋转:RR失去平衡的情况下,旋转方法与LL旋转对称,步骤如下:

    1. 将根节点的右孩子作为新根节点。
    2. 将新根节点的左孩子作为原根节点的右孩子。
    3. 将原根节点作为新根节点的左孩子。

    RR旋转示意图如下: 
    索引

    LR的旋转:LR失去平衡的情况下,需要进行两次旋转,步骤如下:

    1. 围绕根节点的左孩子进行RR旋转。
    2. 围绕根节点进行LL旋转。

    LR的旋转示意图如下: 
    索引

    RL的旋转:RL失去平衡的情况下也需要进行两次旋转,旋转方法与LR旋转对称,步骤如下:

    1. 围绕根节点的右孩子进行LL旋转。
    2. 围绕根节点进行RR旋转。

    RL的旋转示意图如下: 
    索引

  • 相关阅读:
    笔记44 Hibernate快速入门(一)
    tomcat 启用https协议
    笔记43 Spring Security简介
    笔记43 Spring Web Flow——订购披萨应用详解
    笔记42 Spring Web Flow——Demo(2)
    笔记41 Spring Web Flow——Demo
    Perfect Squares
    Factorial Trailing Zeroes
    Excel Sheet Column Title
    Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/fengxf/p/10791223.html
Copyright © 2011-2022 走看看