我想找到二叉搜索树的最大深度。我找到了一个代码。
int maxDepth(struct node* node) {
if (node==NULL) {
return(0);
}
else {
// compute the depth of each subtree
int lDepth = maxDepth(node->left);
int rDepth = maxDepth(node->right);
// use the larger one
if (lDepth > rDepth) return(lDepth+1);
else return(rDepth+1);
}
}
我想知道node-> left怎么会返回1?
是默认的吗?代码很简单,但我不知道答案来自哪里,有人可以解释一下吗?
答案 0 :(得分:2)
鉴于这棵树:
[A]
/ \
[B] [C]
对于[B],将使用NULL调用maxDepth,对于带有NULL的[C],将返回零,因此递归调用最终返回0 + 1.
如果在[C]下有一个节点[D],那么对[D] maxDepth的调用将返回NULL而D将返回0 + 1,然后递归将继续按比例放大,[C]将接收0 + 1并且会返回一些+1,返回maxDepth为2,该值大于保持[B]为1的分支的深度,因此从完全递归返回maxDepth为2。
答案 1 :(得分:1)
当node
指向某个叶子时,其node->left
和node->right
都为NULL
。因此maxDepth()
都返回0
。因此,此叶子的当前递归仅返回深度0 + 1 = 1.
你可以证明它的正确性。
<强>初始化强>
当节点为NULL
时,它返回0
。空树的深度为0
,这是真的。
当节点是叶子时,它返回1
。刚刚解释过。
<强>维护强>
如果节点存在(不是NULL
)且我们知道其子节点的深度,则此节点的深度将为max(depth of left, depth of right) + 1
。这就是回归的原因。
<强>终止强>
它将终止,因为当它到达叶子时,递归将停止变深并返回。整个递归完成后,maxDepth(root)
将返回root
的深度。