寻找二叉树的深度

时间:2012-10-22 16:30:46

标签: c++ binary-tree

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

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。如果有一个包含3个左子节点的bst,则int lchild将返回3.而额外的+ 1是根节点。所以我的问题是,所有这些+1来自哪里。它在最后一个节点返回0,但为什么它在左/右子节点上升时返回0 + 1等?我不明白为什么。我知道它做到了,但为什么呢?

8 个答案:

答案 0 :(得分:7)

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

       A
        \
         B

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

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

  • 为每个maxDepth的孩子(左右分支)致电AA->rightB,但A->left显然为NULL(因为A没有左分支)

  • 比较这些,选择最大值

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

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

前者非常简单:第一次检查会使maxDepth返回0.如果另一个孩子也是NULL,则两个深度都相等(0),我们必须返回0 + 1 A本身。

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

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

关键是当A只是大树的一部分时,要完成的步骤相同;此计算结果(2)将用于更高级别的A次呼叫。

答案 1 :(得分:5)

使用前一个节点+ 1

计算深度

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

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

计算的

答案 4 :(得分:2)

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

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

如果temp(正在查看的节点)为null,则返回0,因为此节点为空且不应计数。这是基本情况。

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

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

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

答案 5 :(得分:0)

要查找二叉树中的最大深度,请继续向左移动并遍历树,基本上执行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

答案 6 :(得分:0)

代码段可以简化为:

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

查看此代码的好方法是从上到下:

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

现在假设树中填充了许多节点。从顶部开始,根节点的if条件为true。然后我们通过将这些子树的根传递给maxDepth来询问LEFT SUB TREE和RIGHT SUB TREE的最大深度是多少。根的LST和RST都比更深,因此我们必须添加一个以获得树的深度 at root of树传递给函数。

答案 7 :(得分:0)

我认为这是正确的答案

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