题目:输入一颗二元树的根节点,求该树的深度。从根节点到叶子节点形成的一条路径,最长路径就是树的深度。
思路:
1.遍历该树,得到所有路径长度,求出最大的路径长度,即为树的深度
2.采用递归思想,先求左子树的深度A,再求右子树的深度B,树的深度为max(A,B) + 1
3.我们迭代树的最左分支,保存它的深度A,并递归每个最左分支节点的右子树的深度,计算右子树的最大深度为B,那么max(A,B)就是树的深度
代码如下:
思路2
int GetDepthOfTree_solution1(const Tree *root){
int l,r;
if(root == NULL) return 0;
l = GetDepthOfTree(root->left);
r = GetDepthOfTree(root->right);
return (l > r ? l + 1 : r + 1);
}
简化:
int GetDepthOfTree_solution1(const Tree *root){
if(root == NULL) return 0;
return (l + max(GetDepthOfTree(root->left),GetDepthOfTree(root->right))
}
要遍历该树的每个节点,所以该思路的时间复杂度是:Θ(n)
思路3:
//iterate over the left branches and recurse on the right ones
//Input: root - the head
//Output:depth of the tree
int GetDepthOfTree_solution2(const BSTreeNode *root)
{
return GetDepth(root, 0);
}
int GetDepth(const BSTreeNode *root, int dl)
{
int dr, dmr;
for(dmr = dr = dl; root != NULL; dl++){
if((dr = GetDepth(root->m_pRight,dl + 1)) > dmr)
dmr = dr;
root = root->m_pLeft;
}
return (dl > dmr ? dl : dmr);
}
dl:最左分支的深度
dr:每个最左分支的节点的右子树的深度
dmr:所有最左分支的节点的右子树的最大深度
内存中堆的空间不是动态分配的,所以可能超出堆的空间,特别是在每个递归都调用两个递归函数。如果你的树是平衡二叉树,它的函数调用次数将达到log(N)^2次。但是如果用思路3的话栈的空间不会增长太快。
平衡二叉树:空树或者它的左右子树的高度的绝对值不超过1
时间复杂度依然是Θ(n)
参考:
http://zhedahht.blog.163.com/blog/static/25411174200732975328975/