递归和常量变量

时间:2012-10-21 03:55:21

标签: c++ recursion binary-tree

我正在尝试创建一个方法,告诉我二进制树的高度,最简单的方法是使用递归,但是出于某种原因我的一个变量被重置,即使我认为我正在检查所以它会保持不变......
这是我的代码

template<class T>
int findHeight(binaryTreeNode<T> , int leftHeight, int rightHeight,
        int maxHeight) {
    if (leftHeight >= rightHeight && leftHeight >= maxHeight) {
        maxHeight = leftHeight;
    }
    else if (leftHeight < rightHeight && rightHeight >= maxHeight) {
        maxHeight = rightHeight;
    }
    if (t != NULL) {
        cout << "current leftHeight " << leftHeight << " current rightHeight "
                << rightHeight << " current maxHeight " << maxHeight << endl;

        findHeight(t->leftChild, ++leftHeight, rightHeight, maxHeight);
        findHeight(t->rightChild, leftHeight, ++rightHeight, maxHeight);
    }
    return ++maxHeight;
}

这是我在尝试时得到的输出:

current leftHeight 0 current rightHeight 0 current maxHeight 0
current leftHeight 1 current rightHeight 0 current maxHeight 1
current leftHeight 2 current rightHeight 0 current maxHeight 2
current leftHeight 2 current rightHeight 1 current maxHeight 2
current leftHeight 1 current rightHeight 1 current maxHeight 1
current leftHeight 2 current rightHeight 1 current maxHeight 2
current leftHeight 3 current rightHeight 1 current maxHeight 3
Returned value = 1

任何人都可以帮助我吗?我怎样才能使maxHeight不会被重置,并且在整个递归过程中随时都会保持找到的最大值。

2 个答案:

答案 0 :(得分:2)

事情变得更简单:

int findHeight(binaryTreeNode<T> *t){
    return t ? 1 + MAX(findHeight(t->leftChild), findHeight(t->rightChild)) : 0;
}

在您的代码中,您遇到了问题,因为maxheight是按值传递的,而不是通过引用传递的。

答案 1 :(得分:0)

函数参数具有自动存储持续时间(通常称为“在堆栈上”)。这意味着每次调用findHeight都有自己的名为maxHeight的变量。您可以在其生命周期结束之前递增其中一个局部变量。虽然您返回递增的值,但在递归调用中不使用该返回值。

使用引用参数,或使用两个递归调用的返回值。