平衡二叉树
1. 索引平衡二叉树(AVL树)是一种自平衡的二叉搜索树,它通过在插入和删除节点时自动调整树的结构,保持树的平衡,从而保证了树的高度始终保持在O(log n)的范围内,这对于提高搜索、插入和删除操作的效率至关重要。
BTree和B+Tree详解_b tree-CSDN博客 这里说明了为什么树的高度会影响查找次数,忘记了可以看一下
那平衡二叉树是怎么构造的呢?
构造平衡二叉树的基本步骤
- 插入节点:与普通二叉搜索树的插入操作类似,根据节点值的大小,将新节点插入到合适的位置。
- 普通二叉搜索树是怎样判定一个节点应该插入到哪里的?
-
在普通二叉搜索树中,插入一个新节点的过程如下:
-
从根节点开始,比较新节点的值与当前节点的值。
- 如果新节点的值小于当前节点的值,移动到当前节点的左子树。
- 如果新节点的值大于当前节点的值,移动到当前节点的右子树。
- 重复上述步骤,直到找到一个空的位置,将新节点插入到该位置。
-
- 普通二叉搜索树插入节点时,第一个要比较的就是根节点,那是怎么定位到根节点的?
- 在普通二叉搜索树中,根节点是树的起始点,所有其他节点都是通过根节点逐步访问到的。定位根节点通常是通过程序中的一个引用或指针来实现的。在大多数编程语言中,二叉搜索树的根节点通常被定义为一个类的属性或变量。
class BinarySearchTree { private TreeNode root; // 根节点 //... 其他成员函数和变量 }
root
变量或属性直接指向二叉搜索树的根节点。当需要访问根节点时,可以通过这个变量或属性来实现。例如,在插入新节点时,可以通过root
属性来访问根节点,并开始比较新节点的值与根节点的值,以确定新节点应该插入到树的哪个位置。
- 在普通二叉搜索树中,根节点是树的起始点,所有其他节点都是通过根节点逐步访问到的。定位根节点通常是通过程序中的一个引用或指针来实现的。在大多数编程语言中,二叉搜索树的根节点通常被定义为一个类的属性或变量。
- 普通二叉搜索树是怎样判定一个节点应该插入到哪里的?
- 检查平衡:插入新节点后,从插入节点开始,向上检查每个节点的平衡因子(即左子树高度减去右子树高度)。
- 调整平衡:如果某个节点的平衡因子超出了[-1, 1]的范围,说明树失去了平衡,需要进行调整。调整操作包括左旋、右旋、先左旋后右旋、先右旋后左旋等,具体的调整方式取决于节点的不平衡类型。
- 为什么可以改变叶子节点的父节点之后还能保证二叉树的排序是正确的,不会影响二叉树的搜索?
- 可以看一下左旋
-
在进行左旋操作时,需要注意以下几点:
- 旋转节点的选择:旋转节点应该是树中高度差超过1的节点。
- 子节点的调整:在旋转过程中,需要正确地调整子节点的关系,以确保树的结构仍然是一棵有效的二叉搜索树。(即左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值,可能要调整多个节点)
- 旋转后的二叉树搜索性质是根据什么调整算法保证的?
- 父节点的更新:在旋转后,需要更新旋转节点和新根节点的父节点关系。
-
通过左旋操作,可以有效地调整二叉搜索树的结构,使其保持平衡,从而提高树的性能。
-
平衡多叉树:
画出索引结构存储情况:
在B+Tree中,一个节存储多个索引key信息且保证排序 ,是通过分裂节点实现的,可以看这篇,
以上的图片需要更新。。。。因为mysql的innoDB存储引擎是按页存储的,且默认会设置主键,并且根据主键构建聚集索引来存储全部数据,这个很重要,可以搜聚集索引和非聚集索引
数据结构之BTree、B+Tree的含义及区别