我正在研究一个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
}
}
答案 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
返回其计算的高度来替换它。