zoukankan      html  css  js  c++  java
  • 面试题:什么叫平衡二叉查找树--AVL树

    查找、插入和删除在平均和最坏情况下都是O(log n)

    增加和删除可能需要通过一次或多次树旋转来重新平衡这个树

    节点的平衡因子是它的左子树的高度减去它的右子树的高度。带有平衡因子 1、0 或 -1 的节点被认为是平衡的。

    带有平衡因子 -2 或 2 的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。

    单向右旋平衡处理LL:由于在*a的左子树根结点的左子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作;----拉齿轮,或者叫升降机  找到那个失衡的节点
    单向左旋平衡处理RR:由于在*a的右子树根结点的右子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作;----反向拉齿轮,找到那个失衡的节点做为跟节点
    双向旋转(先左后右)平衡处理LR:由于在*a的左子树根结点的右子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作。----先变成左左,再拉齿轮就好了
    双向旋转(先右后左)平衡处理RL:由于在*a的右子树根结点的左子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作。----先变成右右,再拉齿轮
     
    删除
    从AVL树中删除可以通过把要删除的节点向下旋转成一个叶子节点,接着直接剪除这个叶子节点来完成。因为在旋转成叶子节点期间最多有 log n个节点被旋转,而每次 AVL 旋转耗费恒定的时间,删除处理在整体上耗费 O(log n) 时间。
    查找
    在AVL树中查找同在一般BST完全一样的进行,所以耗费 O(log n) 时间,因为AVL树总是保持平衡的。不需要特殊的准备,树的结构不会由于查询而改变。(这是与伸展树查找相对立的,它会因为查找而变更树结构。)
  • 相关阅读:
    如何通过地址转换为WGS经纬度
    Oracle动态创建时间分区,以及Oracle12c中快速创建自增列
    asp.net微信jsapi支付
    asp.net关于如何准许api跨域访问
    ajax调用天气接口
    git补充(命令)转自https://github.com/Wasdns/github-example-repo
    git补充(关于pull request)转自知乎
    Linux基础笔记
    git前期准备
    MVC设计模式
  • 原文地址:https://www.cnblogs.com/wust221/p/5396832.html
Copyright © 2011-2022 走看看