C ++ AVL树重新计算高度

时间:2013-04-09 09:13:53

标签: c++ treenode avl-tree

我正在研究一个AVL树的实现,并且我的重新计算高度函数存在问题。当我调用它时,我传递树的根和一个值为1的变量。我已经逐步通过它,并发现一旦它到达while循环它按预期形成,但之后它返回到只有。请你看看它,看看我做错了什么。如果是neede,我会发布更多代码,但我认为该功能将为您提供足够的信息。感谢

void BinaryTree::recalculate(Node *leaf, int count)
{
    if(leaf == NULL)//if we are at the root
    {
        return;//exit the function
    }

     if((leaf->getLeft() != NULL))//if we are not at the end of the subtree
    {
        recalculate(leaf->getLeft(), count);//advance to the next node and re-enter the function

    }

     if(leaf->getRight() != NULL)//if we are not at the end of the right subtree
    {
        recalculate(leaf->getRight(), count);//advance to the next node and re-enter the program
    }

    else
    {
        while(leaf->getParent() != NULL)//calculate each subtree until we are at the root
        {
            leaf = leaf->getParent();//get the parent node
                count++;//increment the height          

            if(leaf->getLeft() != NULL)//if there is an item in the left
            {

                leaf->getLeft()->setHeight(count-1);//sets the hight of the left child
            }

             if(leaf->getRight() != NULL)//if there is an item in the right
            {
             leaf->getRight()->setHeight(count -1);//sets the height of the right child

            }
        }

        return;//exit the function
    }
}

1 个答案:

答案 0 :(得分:0)

您的函数应该计算二叉树的每个子树的高度,并将该值保存在该子树的根节点中。您选择遵循递归方法,这是标准方法。在这种方法中,必须首先计算左右子树的高度,然后对当前节点采用两者中的最高值。

在您的实现中,您使用在参数中传递的名为count的值进行递归调用。这个值的目的是什么,因为我们需要从子节点检索一个计数,而不是将一个计数传递给它们?

如果你:

  • recalculate参数
  • 中删除该值
  • 如果适用,请recalculate方法自动调用两个孩子
  • 使recalculate更新每个子节点高度的当前节点高度

你应该让它工作。以下是基于此算法的可能实现:

void BinaryTree::recalculate(Node *leaf) {
     int count = 0;
    if (leaf == NULL)  {
        return;
    }
    if (leaf->getLeft() == NULL && leaf->getRight() == NULL) {
        // no child, the height is 0
        setHeight(0);
        return;
    }
    if (leaf->getLeft() != NULL) {
        recalculate(leaf->getLeft());
        count = leaf->getLeft()->getHeight();
    }
    if (leaf->getRight() != NULL){
        recalculate(leaf->getRight());
        count = max(count, leaf->getRight()->getHeight());
    }
    // include leaf in the height
    setHeight(count+1);
}

如果无法使用getHeight方法,您可以通过让recalculate返回其计算的高度来替换它。