C++ 递归二叉树的高度

C++ 递归二叉树的高度,c++,recursion,binary-tree,C++,Recursion,Binary Tree,我得到了所有情况下的正确高度,当它是空二叉树时除外。大小应该是零,但我得到1。我尝试在if语句之后更改返回值(去掉+1),但这只会把其他情况弄得一团糟 int BTree::recursive_height_helper(BSTNode *n) { int rHeight = 0; int lHeight = 0; if(n->right == NULL || n->left == NULL) return rHeight+lHeight+1; r

我得到了所有情况下的正确高度,当它是空二叉树时除外。大小应该是零,但我得到1。我尝试在if语句之后更改返回值(去掉+1),但这只会把其他情况弄得一团糟

int BTree::recursive_height_helper(BSTNode *n) {

    int rHeight = 0;
    int lHeight = 0;

    if(n->right == NULL || n->left == NULL) return rHeight+lHeight+1;
    rHeight += recursive_height_helper(n->right);
    lHeight += recursive_height_helper(n->left);

     return rHeight+lHeight+1;
}

您根本没有处理空树(除非您的树具有sentinel根节点),并且树的高度不是子树高度的总和

还有,这些线

int rHeight = 0;
int lHeight = 0;
if(n->right == NULL || n->left == NULL) return rHeight+lHeight+1;
相当于

if(n->right == NULL || n->left == NULL) return 1;
也就是说只有一个子树的树的高度是1,这是不正确的,即使它应该计算节点数

您可以使用一个衬里完成此操作:

int BTree::height(BSTNode *n) 
{
    return n == nullptr ? 0 : 1 + std::max(height(n->left), height(n->right));
}

您可以使用null节点的基本情况来完成这项工作,而rest可以很好地工作

int Solution::maxDepth(BSTNode* A) {
    if(A == NULL)
        return 0;
    return max(maxDepth(A->left) + 1, maxDepth(A->right) + 1);
}

除非我误解了函数的工作原理,否则将传入根节点,不是吗?在这种情况下,高度不能小于1,因为该根节点是整个树。如果传入空指针(该指针为空),则函数将失败。如果处理空指针的情况,则可以传入真正的空树,并返回0。我可能误解了你的情况——在这种情况下,你可以澄清一下。树的高度不是1加上子树的高度之和。它应该是1加上子树的最大高度。我想得太多了。谢谢