二叉树串讲

二叉树串讲

数组

​ 如下图所示,我们创建一个有序数组,对于数组元素的查找操作,其时间复杂度为O(n),但是如果我们使用二分法来对进行查找的话,其时间复杂度为O(log n).

在这里插入图片描述

    public int BinarySearch(int []nums,int target){
        int left=0,right=nums.length-1;
        while (left<=right){
            int mid=left+(right-left)/2;//(left+right)/2这样可能会超过int的最大值
            if (target<mid) right=mid-1;
            if (target>mid) left=mid+1;
            if (target==mid) return mid;
        }
        return -1;//没找到返回-1
    }

​ 在这里简要推导一下二分法的时间复杂度。主要看while循环的执行次数,当while循环执行n次时,时间复杂度为O(n),当while循环执行n2时事件复杂度为O(n2 ),当left==right时循环结束。

对折1次时,剩下n/2个元素

对折2次时,剩下n/22个元素

对折3次时,剩下n/23个元素

对折4次时,剩下n/24个元素

对折k次时,剩下n/2k个元素

假设对折k次时,只剩下1个元素,此时这个元素就是left和right,所以while循环执行了k次,n/2k=1,求得**k=log2n,**所以二分法的时间复杂度为O(log n).

​ 对有序数组使用二分法可以是的事间复杂度变小,从O(n)变为O(logn ),这种效率的提升是显而易见的。**但是这种二分法只能操作有序数组,那对于无序数组该怎么办呢?**大家可能会想那我先对无序数组先排排序,然后再使用二分法来查找元素。这种想法是可以的,但是如果数据量很大,使用排序算法也会额外增加时间复杂度。另外不同的排序算法的效率不一样,更重要的是有些排序算法是不稳定的,并不能达到我们想要的结果。

二叉搜索树(查找树)

​ 面对这种问题,我们主角二叉树出场了,如下图所示。二叉树这种数据结构可以理解为二分法,将数据每次对半折。在查找数据的时候,我只能从二分支中取一个。

​ 二叉树的确将数据分成了很多份,但是这样的数据是无序的,二叉树查找操作的事件复杂度不是O(log n).为了将数据变为有序的,因此引进了比二叉树更高级的结构,二叉查找树,也叫二叉搜索树。二叉搜索树是特别的二叉树,它的特点的是树根节点的值大于左子结点的值,小于右子节点的值。如图3所示。

在这里插入图片描述

在这里插入图片描述

​ 对于图3这种二叉树查找树,查找操作和在有序数组中使用二分法进行查找是一样的,它们的时间复杂度都是O(logn).接下来我们看到图4这中特殊的二叉查找树,它完全符合二叉查找树的特点,但是它的查找操作的时间复杂度并不是O(logn),而是O(n).
在这里插入图片描述

平衡二叉树(AVL树)

​ 二叉搜索树的出现在一定程度上提高了查找操作的效率,但是前提是树具有一个合适的结构,也就是其树的高度不是太高。树的高度越高,二叉查找树的查找效率越低,二叉查找树的数据存储方式越接近数组。

​ 为了解决上诉树的高度问题所带来的查找效率低的问题,引入了平衡二叉树的概念,平衡二叉树也叫AVL树,它是由 Adelson-Velskii 以及 Landis三者共同发明的,因此取它们的名字的首字母来命名。**所谓的平衡二叉树就是树的同一层的节点之间的高度差不超过1。**它可以很好地降低树地高度过高的问题。

像图3这种二叉查找树是一种非平衡二叉树,因为节点2的高度为2,而7的节点高度为0,它们的高度差为2,超过了1。如图5所示的二叉查找树就是一种符合要求的平衡二叉树。

在这里插入图片描述

​ 那么又有新的问题出现了,我们如何将非平衡二叉树转化为平衡二叉树呢?

…未完待续

红黑树

…未完待续

那么又有新的问题出现了,我们如何将非平衡二叉树转化为平衡二叉树呢?

…未完待续

红黑树

…未完待续

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值