自平衡二叉树(Self-balancing binary search tree)
排序二叉树有以下缺点:
同样的关键字集合有可能导致不同的树结构索引,如下图的右图所示,此时他的搜索性能已经是线性的了,为了解决这种"树一边倒的现象",自平衡二叉树就被提出来了。平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度。
平衡二叉树
定义:平衡二叉树或为空树,又被称为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)相关推荐
- 二叉搜索树(binary search tree)的建立、删除、查找
由于输入的数据顺序不同,建立的bst会不一样.最坏的情况就是一个链,所以我们引入了平衡二叉树的概念.这里我们先来看binary search tree.(我随笔里面有一些相关知识) 建立(也就是插入) ...
- Abstract Self-Balancing Binary Search Tree
二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...
- 数据结构与算法(八)二分搜索树(Binary Search Tree)
本文主要包括以下内容: 二分搜索树的基本概念 二分搜索树的基本操作 1. 插入 2. 删除 3. 查询 实现二分搜索树 二分搜索树的不足 二分搜索树的基本概念 二分搜索树(英语:Binary Sear ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结
动态管理集合的数据结构--二叉搜索树 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用字典或者优先队列. 二叉排序树又称为二叉查找树,他或者为空树,或者是满足如下性质的二叉树. (1)若它 ...
- 查找二叉树中出现次数最多的数 Find Mode in Binary Search Tree
为什么80%的码农都做不了架构师?>>> 问题: Given a binary search tree (BST) with duplicates, find all the ...
- 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 ...
- 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 ...
- 学习数据结构 二叉查找树(binary search tree)
2019独角兽企业重金招聘Python工程师标准>>> 为学习 LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树(平衡二叉搜索树),我不很熟悉该树,虽然大致知道 ...
最新文章
- 虚拟机的ubunt系统在登录界面循环往复,登录不进去问题
- equals属于mysql语句吗_equals和==的区别 (Java基础)
- 软件测试-PR在运行场景的时候报错测试机:localhost,连接失败!请检查执行器与压力机之间的网络连接,以及场景组中各个项目配置的路径
- 50张图,带你认识大学各专业
- Ubuntu在启动器中添加自定义程序快捷方式
- Vue.js如何在一个页面调用另一个同级页面的方法
- 活动目录回收站之终极应用---Windows2008 R2 新功能系列之十一
- 部署桌面虚拟化时要考虑的因素
- html文件怎么用影音先锋打开,先锋影音怎么用
- Bp算法公式推导推导-详解
- 小学生必背古诗70首
- 服务器主机是什么系统版本,服务器主机是什么系统
- 你想通过创业赚取人生中的第一桶金
- 剁手节致敬!听当年的老人讲述阿帕网(互联网前身)诞生的故事
- 工程化框架之feather
- 关于sqlldr官方教材上的几个例子ulcase study1-9
- 知识那么多,作为一个IT人我们该怎样有效的学习?
- 开启产品经理之路-产品模型制作
- ​包载紫杉醇的tpgs还原性白蛋白纳米粒/GA-HSA 藤黄酸人血清蛋白纳米粒​
- 英语语法长难句——简单句