C ++中的AVL树重新平衡

时间:2013-04-08 18:06:18

标签: c++ treenode avl-tree

我正在研究一个AVL树。我想我已经让所有的旋转功能正常工作了。我有一个rotateleft,rotateright,rotateleftright和rotaterightleft功能。它们都将节点作为参数。我不知道要传递给这些参数的节点。你能看看我的AVL树重新平衡功能,告诉我是否正确,以及我需要传递给每个这些功能。到目前为止,我有根节点或顶节点,但我认为我错了。我如何告诉我需要传递给这些函数?

这是功能:

void BinaryTree::rebalance(Node *N)
{
    int count = 1;
    if((N->getLeft()->getHeight()) > (N->getRight()->getHeight() + 1))
    {
        if(N->getLeft()->getLeft()->getHeight() > N->getLeft()->getRight()->getHeight())
        {
             rotateRight(root);
             recalculate(root, count);

        }

        else
        {
             rotateLeftRight(root);
              recalculate(root, count);
        }
    }
    else if(N->getRight()->getHeight()> N->getLeft()->getHeight() + 1)
    {
        if(N->getRight()->getRight()->getHeight() > N->getRight()->getLeft()->getHeight())
        {
             rotateLeft(root);
              recalculate(root, count);
        }

        else
        {
            rotateRightLeft(root);
             recalculate(root, count);
        }
    }
}

这是我的旋转leftright

Node* BinaryTree::rotateLeftRight(Node *N)
{
    Node *newNode =  new Node();//declares a new Node
    newNode = N->getLeft();//sets the node

    N->setLeft(rotateLeft(newNode->getLeft());//sets the left subtree
    recalculate(root);//recalculates the height
    root->setHeight(NULL);//sets the height of the root node
    return rotateRight(N);//retuns the tree rotated right
}

这是我的左旋转功能。:

Node* BinaryTree::rotateLeft(Node *N)
{
    Node *newNode =  new Node();//declares a new node
    newNode = N->getRight();//sets the new node to the right child of N
    N->setRight(newNode->getLeft());//sets the right of N equal to new nodes left child
    newNode->setLeft(N);//sets the left child of the new node to N

    return newNode;//retuns the newNode
}

如果我有树50 20 10和15我将传递给每个这些函数以重新平衡树?

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些错误,您在另一个问题中提交的错误中没有这样做,也就是说您不会检查代码中的无效指针:

  • 您不会在方法开始时检查N是否为NULL
  • 如果左侧和右侧节点为NULL

    ,则不检查下面的行(及其对称的兄弟节点)
    if((N->getLeft()->getHeight()) > (N->getRight()->getHeight() + 1))
    

关于算法本身,它取决于旋转函数的行为。 wikipedia entry中描述的算法解释了嵌套if(rotateLeftRightrotateRightLeft方法)中的第二种情况应该执行2次旋转。如果您的旋转功能符合该描述,您应该没问题。

recalculate的情况已经在另一个问题中得到了解决,但在这种情况下,你实际上并不需要重新计算整个子树的高度,正如你在评论中正确告诉我的那样题。唯一不断变化的节点是其子节点已被更改的节点。您应该在每个特定的旋转方法中执行该计算,因为每个案例都准确描述了哪些节点得到更新。