如何确定是否需要左右旋转的右右旋转

时间:2012-07-01 09:22:33

标签: logic avl-tree

我正在尝试实现一个AVL树,我很难知道何时需要RR或RL旋转(LL和LR相同)。

每种方法的前提条件是什么,它们有何不同。我知道当我看到树的图片(直觉)但实际情况是什么时候?

这是一个逻辑问题,无需代码,谢谢。

我所知道的是否涉及树重或重。但是你如何确定?

1 个答案:

答案 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
  ...

递归调用将从添加的节点自下而上展开,一般的想法是检查违反不变量的节点(如果有的话)。当发现该节点时,您需要知道导致不平衡的子树的路径。必须以某种方式解决这个问题,这是一个解决方案。