代码之家  ›  专栏  ›  技术社区  ›  user9573040

递归二叉树高度

  •  1
  • user9573040  · 技术社区  · 6 年前

    我得到了所有情况下的正确高度,当它是空二叉树时除外。大小应该是零,但我得到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;
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   molbdnilo    6 年前

    您根本没有处理空树(除非您的树有哨兵根节点),树的高度不是子树高度的总和。

    还有,这些线路

    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));
    }
    
        2
  •  0
  •   Suraj Prakash    6 年前

    您可以使用null节点的基本情况来完成此操作,而rest可以正常工作。

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