我正在尝试实现一个AVL树,我很难知道何时需要RR或RL旋转(LL和LR相同)。
每种方法的前提条件是什么,它们有何不同。我知道当我看到树的图片(直觉)但实际情况是什么时候?
这是一个逻辑问题,无需代码,谢谢。
我所知道的是否涉及树重或重。但是你如何确定?
答案 0 :(得分:1)
可能有不同的解决方案,但其中一个如下:
在递归添加项时,在每次递归调用时,您应该跟踪该调用是否将节点添加到左侧或右侧子树(例如,通过让add函数返回它)。递归调用后,检查高度不变量。如果您在插入后发现该节点已违反该节点,则您将知道该不平衡的路径。
一些(不完整的)伪代码:
add(item, node):
if item < node.value //should add to left subtree
if node.left is empty
//add item here
else
addedLeft := add(item, node.left)
if node.left.height - node.right.height > 1
if addedLeft
//you know the path to the subtree causing the imbalance is LL, do a RR (single-right) rotation
else
//path is LR, do a LR (double-right) rotation
...
递归调用将从添加的节点自下而上展开,一般的想法是检查违反不变量的节点(如果有的话)。当发现该节点时,您需要知道导致不平衡的子树的路径。必须以某种方式解决这个问题,这是一个解决方案。