【问题标题】:Height of binary tree recursively递归二叉树的高度
【发布时间】:2018-09-16 14:39:05
【问题描述】:

对于空二叉树的所有情况,我都得到了正确的高度。大小应该为零,但我得到 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;
}

【问题讨论】:

  • 除非我误解了你的函数应该如何工作,否则你传入一个根节点,不是吗?在这种情况下,高度不能小于 1,因为该根节点是整个树。如果您传入一个空指针,该指针将为空,您的函数将失败。如果你处理空指针的情况,那么你可以传入一个真正的空树,然后返回 0。我可能误解了您的情况 - 在这种情况下,您可以澄清一下。
  • 一棵树的高度不是 1 加上子树的高度之和。它应该是 1 加上子树高度的最大值。
  • 啊,我明白了。我想多了。谢谢。

标签: c++ recursion binary-tree


【解决方案1】:

您可以使用 null 节点的基本情况来做到这一点,其余的就可以了。

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

【讨论】:

    【解决方案2】:

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

    还有这几行

    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));
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 2019-05-18
      • 2018-05-06
      • 1970-01-01
      • 2016-04-19
      • 2014-03-29
      • 2021-09-07
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多