1

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

每个的先决条件是什么,它们有何不同。我知道当我看到树的图片时(直观地),但实际情况是什么?

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

我所知道的是它涉及到左重或右重的树。但是你怎么确定呢?

4

1 回答 1

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

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

于 2012-07-01T09:50:55.180 回答