二分查找,二叉树,平衡二叉树,B树,B+树,B*树

一、二分查找(Binary search)
  • 用数组(数组必须是有序的)实现二分查找在这里插入图片描述
    比如要查找55
    1)找到数组下标0~9的中间下标4的值30,用30和55进行比较
    2)找到数组下标5~9的中间下标7的值48,用48和55进行比较
    3)找到数组下标8~9的中间下表8的值55,用55和55进行比较
    下标为8的值就是我们要找的值,总共进行了三次就找到了我们要查找的值,如果使用遍历的方式的话,我们需要进行九次才能找到55。
  • 时间复杂度
    遍历的时间复杂度为O(n)
    二分查找的时间复杂度为O(log2n)
  • 代码实现
public static void main(String[] args) {
	int[] array = {5,10,19,21,30,37,40,48,55,68};
	int index = binarySearch(array, 55);
	System.out.println(index);
}
/**
  * 二分法
  * @param a 数组
  * @param key 值
  * @return int 数组下标
  */
private static int binarySearch(int[] a, int key) {
	int low = 0;
	int high = a.length -1;
	int n = 0;
	while (low <= high) {
		 n = n + 1;
	    System.out.println("第" + n + "次调用");
	    int mid = (low + high) >>> 1;
	    if (key > a[mid]) {
	        low = mid + 1;
	    } else if (key < a[mid]) {
	        high = mid - 1;
	    } else {
	        return mid;
	    }
	}
	return -1;
}
// 运行结果
第1次调用
第2次调用
第3次调用
8
二、二叉树(Binary tree)

二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
注:每个节点最多只能有两个子树
在这里插入图片描述

  • 二叉树的遍历
    1)先序遍历
    第一访问根结点;第二遍历左子树; 第三遍历右子树。
    结果:ABDGHICEJF
    2)中序遍历
    第一遍历左子树;第二访问根节点; 第三遍历右子树。
    结果: GDIHBAEJCF
    3)后序遍历
    第一遍历左子树;第二遍历右子树,第三访问根节点
    结果:GIHDBJEFCA
    4)层序遍历
    从第一层从左向右遍历
    结果:ABCDEFGHJI
  • 二叉树的分类
    1)斜二叉树:所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树
    2)满二叉树:所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树
    3)完全二叉树:对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树
  • 二叉树的存储结构
    1)顺序存储
    二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。只有完全二叉树不会浪费存储空间
    2)链式存储
    既然顺序存储不能满足二叉树的存储需求,那么考虑采用链式存储。由二叉树定义可知,二叉树的每个结点最多有两个孩子。因此,可以将结点数据结构定义为一个数据和两个指针域
    在这里插入图片描述
三、二叉查找树(Binary search tree)
  • 定义:
    一棵空树,或者是具有下列性质的二叉树:
    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
    (3)左、右子树也分别为二叉排序树;

用二分查找发,数组虽然查找很快,但是插入和删除很慢,所以为了结合链表插入的灵活性和有序数组查找的高效性,引入了二叉查找树
在这里插入图片描述
将上面数组转成二叉查找树,可能为斜二叉树,也可能是两边分布均匀的二叉树,当我们要查找目标数据的时间复杂度是和树的高度成正比,树的高度越高,时间复杂度越高,所以平衡二叉树也很难达到快速查找的效果

四、平衡二叉查找树(Balanced Binary Tree)

是一种结构平衡的二叉搜索树,即叶节点高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
但是平衡二叉查找树遵循二叉树的规则,也就是每个节点最多只有两个子树,那么数据量特别大的时候就会导致树的高度变大,导致数据查找变慢

五、B树(多叉平衡查找树)

在这里插入图片描述
在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查找的关键字在Ki与Ki+1之间,Pi为指向子树根节点的指针,此时取指针Pi所指的结点继续查找,直至找到,或指针Pi为空时查找失败。
一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
1、根结点至少有两个子女;
2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;
3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;
4、所有的叶子结点都位于同一层。

六、B+树(多叉平衡查找树)

在这里插入图片描述
B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下:
(1)每个结点至多有m个子女;
(2)除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;
(3)有k个子女的结点必有k个关键字。
B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值