排序二叉树有以下缺点:

同样的关键字集合有可能导致不同的树结构索引,如下图的右图所示,此时他的搜索性能已经是线性的了,为了解决这种"树一边倒的现象",自平衡二叉树就被提出来了。平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度。



平衡二叉树

定义:平衡二叉树或为空树,又被称为AVL树(有别于AVL算法)或为如下性质的二叉排序树:
(1)左右子树深度之差的绝对值不超过1;
(2)左右子树仍然为平衡二叉树.
平衡二叉树必定是二叉搜索树,反之则不一定。
平衡二叉树的常用实现方法:AA树、AVL树、红黑树、树堆Treap、伸展树等AVL 树是高度平衡的,频繁的插入和删除,会引起频繁的reblance,导致效率下降
红黑树不是高度平衡的,算是一种折中,插入最多两次旋转,删除最多三次旋转。

平衡因子(平衡度)

平衡因子=左子树高度-右子树高度

当平衡因子为1,-1,0时,当前的树处于平衡状态,当平衡因子为2,-2时,当前树处于不平衡状态,需要进行自平衡

如何进行自平衡

  • 找平衡因子=2/-2
  • 找插入新结点后失去平衡的最小子树
    该子树要求:
    1.距离插入结点最近
    2.平衡因子绝对值为1的结点作为根
  • 平衡调整(有4种情况如下)

    左旋和右旋?
    总结了一句口诀(主要用于写代码):
左旋:其右子(若有)给其父结点的左结点
右旋:其左子(若有)给其父结点的右结点

如图演示:

代码实现

叶点类:

class AVLTreeNode{public int data;public AVLTreeNode left;public AVLTreeNode right;public int height;public int getData() {return data;}public void setData(int data) {this.data = data;}public AVLTreeNode getLeft() {return left;}public void setLeft(AVLTreeNode left) {this.left = left;}public AVLTreeNode getRight() {return right;}public void setRight(AVLTreeNode right) {this.right = right;}public int getheight() {return height;}public void setheight(int height) {this.height = height;}public AVLTreeNode(int data){initiateNode(data,null,null,1);}public AVLTreeNode(int data,AVLTreeNode left,AVLTreeNode right,int height){initiateNode(data,left,right,height);}public void initiateNode(int date,AVLTreeNode left,AVLTreeNode right,int height){this.setData(date);this.left=left;this.right=right;this.height=height;}// 返回左子树的高度public int leftHeight() {if (left == null) {return 0;}return left.height();}// 返回右子树的高度public int rightHeight() {if (right == null) {return 0;}return right.height();}//递归返回以该结点为根结点的树的高度public int height() {//+1因为本身也占一层return Math.max(left == null ? 0 : left.height(), right == null ? 0 : right.height()) + 1;}
}

LL型旋转:

/** LL型旋转;左左对应的情况(左单旋转)* 传入值:旋转前的根结点* 返回值:旋转后的根节点*/private AVLTreeNode leftLeftRotation(AVLTreeNode root) {AVLTreeNode rootLeft=root.left;//右子结点给父结点的左结点root.left=rootLeft.right;//将原根结点作为rootLeft的右结点,让rootLeft成为新的根结点rootLeft.right=root;//重新计算高度root.height = root.height();rootLeft.height = rootLeft.height();return rootLeft;}

    private AVLTreeNode rightRightRotation(AVLTreeNode root) {AVLTreeNode rootRight=root.right;//左子结点给父结点的右结点root.right=rootRight.left;//将原根结点作为rootRight的左结点,让rootRight成为新的根结点rootRight.left=root;//重计算高度root.height = root.height();rootRight.height=rootRight.height();return rootRight;}

LR旋转:需要经过两次旋转(右旋后左旋)才能让AVL树恢复平衡

 private AVLTreeNode leftRightRotation(AVLTreeNode root) {//先右旋再左旋root.left = rightRightRotation(root.left);return leftLeftRotation(root);}

  private AVLTreeNode rightLeftRotation(AVLTreeNode root) {root.right = leftLeftRotation(root.right);return rightRightRotation(root);}

自平衡二叉树(Self-balancing binary search tree)相关推荐

  1. 二叉搜索树(binary search tree)的建立、删除、查找

    由于输入的数据顺序不同,建立的bst会不一样.最坏的情况就是一个链,所以我们引入了平衡二叉树的概念.这里我们先来看binary search tree.(我随笔里面有一些相关知识) 建立(也就是插入) ...

  2. Abstract Self-Balancing Binary Search Tree

    二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...

  3. 数据结构与算法(八)二分搜索树(Binary Search Tree)

    本文主要包括以下内容: 二分搜索树的基本概念 二分搜索树的基本操作 1. 插入 2. 删除 3. 查询 实现二分搜索树 二分搜索树的不足 二分搜索树的基本概念 二分搜索树(英语:Binary Sear ...

  4. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  5. 【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结

    动态管理集合的数据结构--二叉搜索树 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用字典或者优先队列. 二叉排序树又称为二叉查找树,他或者为空树,或者是满足如下性质的二叉树. (1)若它 ...

  6. 查找二叉树中出现次数最多的数 Find Mode in Binary Search Tree

    为什么80%的码农都做不了架构师?>>>    问题: Given a binary search tree (BST) with duplicates, find all the  ...

  7. LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List--转换二叉树为双向链表--Java,C++,Python解法

    题目地址:Convert Binary Search Tree to Sorted Doubly Linked List - LeetCode Convert a BST to a sorted ci ...

  8. LeetCode: 109. Convert Sorted List to Binary Search Tree

    题目 Given a singly linked list where elements are sorted in ascending order, convert it to a height b ...

  9. 学习数据结构 二叉查找树(binary search tree)

    2019独角兽企业重金招聘Python工程师标准>>> 为学习 LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树(平衡二叉搜索树),我不很熟悉该树,虽然大致知道 ...

最新文章

  1. 虚拟机的ubunt系统在登录界面循环往复,登录不进去问题
  2. equals属于mysql语句吗_equals和==的区别 (Java基础)
  3. 软件测试-PR在运行场景的时候报错测试机:localhost,连接失败!请检查执行器与压力机之间的网络连接,以及场景组中各个项目配置的路径
  4. 50张图,带你认识大学各专业
  5. Ubuntu在启动器中添加自定义程序快捷方式
  6. Vue.js如何在一个页面调用另一个同级页面的方法
  7. 活动目录回收站之终极应用---Windows2008 R2 新功能系列之十一
  8. 部署桌面虚拟化时要考虑的因素
  9. html文件怎么用影音先锋打开,先锋影音怎么用
  10. Bp算法公式推导推导-详解
  11. 小学生必背古诗70首
  12. 服务器主机是什么系统版本,服务器主机是什么系统
  13. 你想通过创业赚取人生中的第一桶金
  14. 剁手节致敬!听当年的老人讲述阿帕网(互联网前身)诞生的故事
  15. 工程化框架之feather
  16. 关于sqlldr官方教材上的几个例子ulcase study1-9
  17. 知识那么多,作为一个IT人我们该怎样有效的学习?
  18. 开启产品经理之路-产品模型制作
  19. ​包载紫杉醇的tpgs还原性白蛋白纳米粒/GA-HSA 藤黄酸人血清蛋白纳米粒​
  20. 英语语法长难句——简单句

热门文章

  1. list dict 性能测试
  2. 北风设计模式课程---13、享元模式
  3. C:输入数字计数(数组方法)
  4. 简要说说一个完整机器学习项目的流程
  5. ubuntu下安装mysql及常用操作
  6. 大道至简第一章读后感(伪代码)
  7. cvThreshold()函数理解
  8. Java 异常Exception
  9. 使用Visual Studio实现WinForm多语言版本实例
  10. PHP5.4.3,有些插件不是你想用就能用的