int Max(int a, int b)
{
return a > b?a:b;
}
int LMR(struct TreeNode* Node)
{
if(Node == NULL)
return 0;
else
return Max(LMR(Node->left) + 1, LMR(Node->right));
}
这段代码其实不是求树的深度,而是求森林的深度。因为树可以看成是只有一棵树的森林,所以也可以用。
森林的深度是所有树的深度最大值,而树的深度就是子树林的深度加1。因此,森林的深度就是:
Max(第一树的子树林深度+1,第一棵树的兄弟树林的深度)
而二叉树表示的森林恰好是左节点是第一棵子树的根,右节点是下一个兄弟。如果把它看成是用右节表示的链表,左节点就成了子树林。
这段代码也可以这样写:
int LMR(struct TreeNode* Node)
{
if(Node == NULL)
return 0;
else
{
int Result = LMR(Node->child) +1;//child即left
Node = Node->brother;//brother即right
while (Node != NULL)
{
Result = Max(LMR(Node->child) +1, Result);
Node = Node -> brother;
}
return Result;
}
}
一个是双递归,一个是单递归加循环,道理都是一样的。