数据结构---二叉树(2)---平衡二叉树(3)

0.简介

前面分析了平衡二叉树是怎么调整平衡的,这里就来解决另一个问题,平衡二叉树理论为什么能成立?难道就不会有怎么调都不会平衡的情况吗?一起探究一下吧。

1.平衡二叉树

我在很早的时候就注意到了一个问题。

二叉树变形

上图中是一颗不平衡的二叉树向平衡调整的一部分过程,这个过程中我发现,子树a,b,c,d的左右关系始终都是不变的,就是从左到右来看始终都是a,b,c,d这个顺序,并且圆圈里的BCA这三个节点的顺序也始终都是不变的,那变化的是什么呢?从图中我们只能观察到,变化的是树的形状。

因为平衡二叉树是按照左小,右大的方式存储的,正是这个关系带来了一些有趣的性质。

平衡调整

上图中是一颗不平衡的二叉树调整为平衡的二叉树,由于左小右大这个顺序限制,这两个树的中序遍历都是有序的,不仅如此,两个树的中序序列是一样的,为什么中序序列是有序的就不多解释了,我们关注为什么中序序列是一样的。

因为两个树的左右子树都有大小关系的约束,所以就导致了两个树的中序序列是相同的,假如我们将中序序列存储在数组中,那么当我们向其对应的二叉树中插入一个数字的时候,是不是很像用二分查找往数组里插入一个数字?那么我们利用平衡二叉树访问一个数字的时候,是不是很像在这个有序的中序遍历形成数组中用二分查找去找某个数?

然而当向树中插入新节点的时候,再调整平衡,调整前后中序序列不变,但是树的形状变了。我们再看如果是利用二分查找往有序数组里插入一个数字后,当再次进行二分查找某个数字的时候,是不是有可能插入前后的二分查找路径变了?

那么我们猜想,平衡二叉树是不是对应着某个有序序列的二分查找路径呢?或者说排序查找树就对应着一个有序序列的二分查找路径,我们单独看二分查找,查找的时间复杂度是O(logn),因为每次查找的时候,查找的入口都是有序序列的正中间,因为序列存储在数组中,所以可以很容易的计算出数组的中间的位置,从而使得查找深度维持在O(logn),假如我们将查找的入口固定不变,然后始终用固定的二分路线向数组中插入数字。如下图

二分插入

看起来就像普通的二叉查找树插入数字一样,固定了查找入口,如果是正常的二分查找,每次都要计算从哪个数字开始查找的,最终使得从入口到终点,每条查找路径都近乎一样长,就算有差别,相差长度也不会超过1,注意前面那句话,这和平衡二叉树的规则有点相似,两端子树之差不超过1,我能想到的是,平衡二叉树每次调整平衡就是类似二分查找一样,是在寻找一个最佳的中间点作为入口,因为二分查找是数组中,所以可以很方便的找到最靠近中间的数字,而树就需要麻烦一些了,换句话说,平衡二叉树中每次调整的不是数据的顺序,而是访问路径,就像是链表版本的二分查找,那么二分查找符合的性质平衡二叉树基本都应该具备。

那么对于一个有序数组,利用二分查找,总能找到一个最佳的访问路径,使得每条路径都几乎一样并且最大差不超过1,并且查找深度都能维持在O(logn),对于链表版本的二分查找平衡二叉树来说,树总能调整到平衡的状态,也是最优的状态,这里我们不再将平衡二叉树理解为数据,而是访问数据的路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值