64,646
社区成员
发帖
与我相关
我的任务
分享
int PostTreeDepth(BiTree root)
{
int hl,hr,max;
if(root != NULL)
{
hl = PostTreeDepth(root->LChild);//求左子树的深度
hr = PostTreeDepth(root->RChild);//求右子树的深度
max = hl>hr?hl:hr;//得到左右子树深度较大者
return(max+1);//返回树的深度
}
else
{
return 0;//空树返回0
}
}
int Hight(Node* root)
{
if ( !root )
return 0;
else
return max(Hight(root->left_child),Hight (root->right_child)) + 1
}
我讲一下自己的简单理解。
!root , 也就是指针为空的时候返回 0;
就是说,遇到空节点,返回 0 ;
下一行: return max()+ 1 ;
这个是关键点,返回每一个子节点的高度,
括号内,是调用自身这个函数(返回节点树高度)
整个函数的思想可以看做是分治:即把大问题分解成小问题,对于整体函数,不需要知道每一步的执行过程,只需要知道上一步的结果就可以。
每个函数调用自身,判断出是否需要继续调用函数,还是直接返回最根部的值 0 。如果调用函数,即需要获取调用函数的返回值即可。
如果想理解这个函数,提供一个逆向的思维方式,从叶子结点开始思考,也就是 !root 那一行,返回了 0 ,调用他的函数 作对比,取最高值(深度最深值),依次递增到根节点或所输最外层节点,最终返回最大深度。
实现性原理:
每次递归调用一次函数时,计算机都会新开辟出一段函数空间、存储空间,为当前新调用的函数提供存在的空间。 以这个函数的运行为例,系统最终会开辟一个类似树形连接的区域,然后再依次确定每个函数的返回值(从叶子结点开始)。
所以,递归,也是一种 典型的 用空间换时间 的算法。