试举例说明,如何区分压杆的稳定平衡二叉树如何旋转与不稳定平衡二叉树如何旋转

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“专业文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取,非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取,具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档。

写在前面:在学习平衡二叉树之前我们必须对二叉查找树有所了解,请参阅我的另一篇博文

information"中发表了它。),它是二叉查找树的一种变体,除了满足二叉查找树的性质之外还要满足如下性质:①根节点的左子树深度和右子树的深度之差的绝对值小于2;②左子树和右子树也是一棵平衡二叉树。

既然有了二叉查找树,为何又要发明平衡二叉树?我们知道二叉查找树在插入操作的过程中,比如说要向二叉树

依次插入节点K1<K2<K3<K4,那么二叉查找树就退变成了链表,对链表的插入、删除、查找的操作时间为O(n), 然而对于平衡二叉树的插入、删除、查找的操作时间为O(lgn)。

二、AVL树的基本操作

1、在介绍AVL树的基本操作之前,我们先来看看AVL树失衡的情况。

①左左情况:如图一所示,K1的左子树的高度与右子树的高度之差为2,所以以K1位根节点的树不是平衡二叉树,K1为失衡的节点。以K1的左孩子K2为根的子树,K2的左子树的高度大于右孩子的高度,所以这样失衡的树为左左情况。我们通过旋转来保持二叉树的平衡性质。以K2为支撑柱,拿着节点K3顺时针转动,然后再调整各节点所指向的指针。

②右右情况:如图二所示,其实右右情况与左左情况是镜像对称的。这里就不再赘述,看图就能明白一切。

③左右情况:如图三所示,K1的左子树的高度与右子树的高度之差为2,所以以K1位根节点的树不是平衡二叉树,K1为失衡的节点。以K1的左孩子K2为根的子树,K2的右子树的高度大于左孩子的高度,所以这样失衡的树为左右情况。我们先对K1的左子树根K2进行右右情况的旋转,然后再以K1为根进行左左情况旋转,也就是进行双旋转。

④右左情况:如图四所示,右左情况和左右情况是镜像对称的,这里也不在赘述。

平衡二叉树的插入和删除操作很有可能会改变平衡性质,这时我们就要对这棵非平衡的二叉树进行旋转操

作来保持其平衡性质。基本思路是这样:如果是插入操作,因为插入到树中的节点永远是叶子节点,所以我们要沿着插入节点过程的逆方向来寻找最小失衡子树;如果是删除操作,删除节点的左子树有可能会成为非平衡最小二叉树。当调整最小失衡子树为平衡子树时,不会影响其他平衡子树的性质,当所有的最小失衡子树调整为平衡子树时,整个二叉树也就是平衡二叉树了。

/*判断一棵树是不是平衡二叉树*/ /*平衡二叉树的插入操作*/ /*平衡二叉树的删除操作*/ /*调整失衡的二叉树,*root为删除或添加的节点的指针*/ /*当一棵树不是平衡二叉树的时候需要做的旋转,root为失衡子树的根节点*/ /*用节点v替换节点u*/ /*根据平衡二叉树的定义: 1、根节点的左子树和右子树的深度值差不能不大于1, 2、并且其左右子树也是一颗平衡二叉树*/ /*构造并初始化节点*/ /*为空树则直接插入*/ /*不为空树,在插入的过程中需要保持平衡*/ /*平衡二叉树的删除操作: 1、删除的节点没有孩子节点 2、删除的节点只有一个孩子节点 3、删除的节点有两个孩子节点*/ BTree x;//用来保存指向有可能会是最小非平衡子树的根节点 /*找到要删除的节点*/ /*删除的节点有两个孩子节点*/ /*如果是这种情况那么在删除后,以z->parent为根节点的树可能会成为最小非平衡子树*/ /*如果是这种情况那么在删除后,以z->rchild为树根的树的左子树的高度会降低,有可能会成为最小非平衡子树*/ /*有一个孩子节点*/ /*如果是这种情况那么在删除后,以z->parent为根节点的树可能会成为最小非平衡子树*/ /*如果是这种情况那么在删除后,以z->parent为根节点的树可能会成为最小非平衡子树*/ /*完成删除之后,我们要保持删除之后的树任然为平衡二叉树*/ /*调整失衡的二叉树: 首先在插入(或删除)新结点处沿着树向上找到失去平衡的最小子树根结点的指针。 然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。 当失去平衡的最小子树被调整为平衡子树后,原有其他所有平衡子树无需调整, 整个二叉排序树就又成为一棵平衡二叉树。*/ 失衡节点的左子树高度-左子树高度>1 失衡节点的左孩子的左子树高度大于失衡节点的左孩子的右子树高度 失衡节点的左子树高度-左子树高度>1 失衡节点的左孩子的左子树高度小于失衡节点的左孩子的右子树高度*/ /*先右右情况的旋转*/ /*再左左情况的旋转*/ /*先左左情况的旋转*/ /*再右右情况的旋转*/ /*用节点v替换节点u*/ }每行代码都有详细的注释,你可以通过加断点调试来验证代码的正确性。

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“专业文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取,非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取,具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档。

我要回帖

更多关于 平衡二叉树如何旋转 的文章

 

随机推荐