繁体   English   中英

寻找二叉树的深度

[英]Finding Depth of 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等? 我不明白为什么。 我知道它做到了,但为什么呢?

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

       A
        \
         B

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

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

  • 为每个A的孩子(左和右分支)调用maxDepth A->rightB ,但是A->left显然是NULL (因为A没有左边的分支)

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

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

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

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

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

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

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

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

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

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

您将自己添加+1到树叶中获得的结果。 在退出函数的所有递归调用并进入根节点之前,这些将继续累加。

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

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

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

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

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

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

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

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

代码段可以简化为:

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

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

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

现在假设树中填充了许多节点。 从顶部开始, if节点对于根节点都是true的。 然后我们通过将这些子树的根传递给maxDepthmaxDepth LEFT SUB TREE和RIGHT SUB TREE的最大深度是maxDepth 根的LST和RST都比根深一级 ,所以我们必须添加一个以获得传递给函数的树 root的树的深度。

我认为这是正确的答案

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM