【问题标题】:Finding Depth of Binary Tree查找二叉树的深度
【发布时间】:2012-10-12 12:22:04
【问题描述】:

我无法理解这个 maxDepth 代码。任何帮助,将不胜感激。这是我遵循的 sn-p 示例。

int maxDepth(Node *&temp)
{
  if(temp == NULL)
  return 0;

 else
{
 int lchild = maxDepth(temp->left);
 int rchild = maxDepth(temp->right);

 if(lchild <= rchild)
 return rchild+1;

 else
  return lchild+1;

 }

}

基本上,我的理解是该函数递归调用自身(对于每个左右情况),直到它到达最后一个节点。一旦完成,它会返回 0,然后执行 0+1。那么前一个节点是1+1。那么下一个是2+1。如果 bst 有 3 个左孩子, int lchild 将返回 3。额外的 + 1 是根。所以我的问题是,所有这些 +1 来自哪里。它在最后一个节点返回 0 但为什么它在左/右子节点上升时返回 0+1 等?我不明白为什么。我知道它可以,但为什么呢?

【问题讨论】:

  • 呃,因为如果有一个新节点,那么深度可能是前一个加一?

标签: c++ binary-tree


【解决方案1】:

我认为这是正确的答案

int maxDepth(Node *root){
    if(root){ return 1 + max( maxDepth(root->left), maxDepth(root->right)); }
    return -1;
}

【讨论】:

    【解决方案2】:

    代码 sn-p 可以简化为:

    int maxDepth(Node *root){
        if(root){ return 1 + max( maxDepth(root->left), maxDepth(root->right)); }
        return 0;
    }
    

    从上到下查看这段代码的好方法:

    如果 BST 没有节点会怎样?我们将拥有root = NULL,并且该函数将立即返回预期的深度0

    现在假设树中填充了许多节点。从顶部开始,if 条件将是 true 用于根节点。然后我们通过将这些子树的根传递给maxDepth 来询问左子树和右子树的最大深度是多少。根的 LST 和 RST 都比根深一级,所以我们必须加一才能得到树的深度 at root传递给函数。

    【讨论】:

    • 错误的是 int maxDepth(Node *root){ if(root){ return 1 + max( maxDepth(root->left), maxDepth(root->right)); } 返回 -1; }
    【解决方案3】:

    要找到二叉树的最大深度继续向左遍历树,基本上执行DFS
    要么 我们可以通过三种不同的递归方式找到二叉搜索树的深度

    – using instance variables to record current depth and total depth at every level
    – without using instance variables in top-bottom approach
    – without using instance variables in bottom-up approach
    

    【讨论】:

      【解决方案4】:

      考虑这部分(一棵更大的树):

             A
              \
               B
      

      现在我们要计算这个树部分的深度,所以我们将指针传递给A 作为它的参数。

      显然指向A 的指针不是NULL,所以代码必须:

      • A 的每个孩子(左右分支)调用maxDepthA-&gt;rightB,但A-&gt;left 显然是NULL(因为A 没有左分支)

      • 比较这些,选择最大的值

      • 返回这个选定的值 + 1(因为A 本身需要一个级别,不是吗?)

      现在我们来看看maxDepth(NULL)maxDepth(B) 是如何计算的。

      前者很简单:第一次检查将使maxDepth 返回0。如果另一个孩子也是NULL,则两个深度将相等(0),我们必须为@987654337 返回0 + 1 @ 自己。

      但是B 不为空;但是它没有分支,所以(正如我们注意到的)它的深度是 1(两个部分的 NULLs 为 0,B 本身为 1)。

      现在让我们回到A。其左分支的maxDepth (NULL) 为 0,其右分支的maxDepth 为 1。这些最大值为 1,我们必须为 A 本身添加 1 - 所以它是 2。

      A 只是较大树的一部分时,要执行相同的步骤;此计算 (2) 的结果将用于更高级别的 maxDepth 调用。

      【讨论】:

        【解决方案5】:

        使用前一个节点 + 1 计算深度

        【讨论】:

          【解决方案6】:

          记住在二叉树中一个节点最多有 2 个子节点(左和右)

          它是一种递归算法,所以它一遍又一遍地调用自己。

          如果 temp(正在查看的节点)为 null,则返回 0,因为该节点什么都不是,不应该计算在内。这是基本情况。

          如果正在查看的节点不为空,则它可能有子节点。所以它得到左子树的最大深度(并为当前节点的级别加 1)和右子树(为当前节点的级别加 1)。然后它比较两者并返回两者中的较大者。

          它潜入两个子树(temp->left 和 temp->right)并重复操作,直到它到达没有子节点的节点。那时它将在左右调用 maxDepth,这将为 null 并返回 0,然后开始返回调用链。

          因此,如果您有一个由三个节点组成的链(例如 root-left1-left2),它将下降到 left2 并调用 maxDepth(left) 和 maxDepth(right)。每个都返回 0(它们为空)。然后它又回到了left2。它比较,两者都是0,所以两者中的较大者当然是0。它返回0 + 1。然后我们在 left1 - 重复,发现 1 是它的左 n 右中的较大者(也许它们是相同的或者它没有右孩子)所以它返回 1+1。现在我们在根,同样的,它返回 2+1 = 3,也就是深度。

          【讨论】:

            【解决方案7】:

            因为深度是用前一个节点+1计算的

            【讨论】:

              【解决方案8】:

              所有的都来自这部分代码:

              if(lchild <= rchild)
                  return rchild + 1;
              else
                  return lchild + 1;
              

              您将自己+1 添加到在树的叶子中获得的结果中。这些不断累加,直到您退出函数的所有递归调用并到达根节点。

              【讨论】:

                猜你喜欢
                • 2020-04-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-09
                相关资源
                最近更新 更多