请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

bobo老师想问您有关AVL插入结点旋转的问题


https://img1.sycdn.imooc.com//szimg/5ce146910001e59a07340595.jpg

老师,对比您RL的讲解图中我知道了,是当插入28时,以34为轴先进行右转,再以98为轴进行左转。

但是我不理解的是RL指的是插入的元素在不平衡的结点的右侧的左侧叫RL,第一个不平衡的点是23啊,它的右侧的左侧并没有不平衡啊。。。

另外我觉得您的图中为了不失一般性,也给Z结点加了两个子结点,这样感觉逻辑上说不通,这样算是添加了一棵树导致不平衡的吗?(我能明白您这样讲的话,拓展性更强,类似的树都可以这样的旋转,比如我图片上那道题,如果单纯对比形状的话,我就能知道如何去旋转)

正在回答

1回答

liuyubobobo 2019-05-20 09:54:26

好认真,字也好漂亮:)


首先,RL是针对23说的,没有问题。但是,我们在具体纠正23的这个RL不平衡的时候,需要动这个23的右孩子。也就是我们代码中的:

// RL的情况
if (balanceFactor < -1 && getBalanceFactor(node.right) > 0) {    
    
    // 先对node的右孩子做右旋转
    node.right = rightRotate(node.right);    
    
    // 再对node做左旋转
    return leftRotate(node); 
    
    // 这样的两步,维护了node这个节点的RL不平衡;LR同理   
}


至于我在图中,会给z加入其他节点,是因为,在我们递归回溯的过程中,这个不平衡,不一定出现在最底下,也就是不一定是在T2为空且T3为空的地方。对于此,向AVL树中添加元素,是没有问题的。但是,后续你就会看到,我们在AVL树中删除元素,使用的是同样的平衡维护方式。但是,由于我们删除元素的位置可能是在树的中间,那么这个需要平衡维护的RL状态,也可能出现在整棵树的中间:)


继续加油!:)

1 回复 有任何疑惑可以回复我~
  • 提问者 江景又妍和 #1
    谢谢老师~
    回复 有任何疑惑可以回复我~ 2019-05-20 12:20:29
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号