[英]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->right
是B
,但是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
的。 然后我们通过将这些子树的根传递给maxDepth
来maxDepth
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.