我无法理解这个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等?我不明白为什么。我知道它做到了,但为什么呢?
答案 0 :(得分:7)
考虑这部分(更大的树):
A
\
B
现在我们想要计算这个treepart的深度,所以我们将指针传递给A
作为它的参数。
显然指向A
的指针不是NULL
,因此代码必须:
为每个maxDepth
的孩子(左右分支)致电A
。 A->right
为B
,但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;
}