题目如下:
上一次接触过二叉树这种数据结构是在编写霍夫曼压缩算法的代码实现的时候,使用树这种结构来求每个字符的最短编码(出现频率越高,需要编码长度越短(省空间),在树结构结构中,该叶子节点就越接近根节点,即路径越短,编码越短);看到这个题目,就确定是递归的做法;
递归其实就是在程序中不断地调用自身函数,不过要注意内存,并且递归必须需要有一个结束条件,不然就会出现无限递归的情况,最后栈内存就会溢出了;
上面这个树,肉眼一看,树的深度就是4,计算机没办法直接看出来,只能先看左子节点在不在,在的话就在小本本上加1,然后,继续深入到下一个左节点,继续判断还有没有左子节点,有的话就继续加个1,直到没有左子节点(也就是到了叶子节点)了就要返回上一层,再按照上面的方法判断右节点是否存在,大概的过程就是这样的:
上面的每一次前进都是每一次的递归调用(传递了目前在第几层),撤退则是程序的返回(带回了到达的最深层数),当撤退一次后,还需要看一下右边能不能走(右节点是不是空的),右节点存在的话,还需要递归来计算右节点的深层数,最后比较得到左右节点的最大值,继续返回直到到达根节点;代码如下:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型
*/
int maxDepth(struct TreeNode* root ) {
// write code here
return dft(root, 0) ; //从根节点开始递归
}
int dft(struct TreeNode *node, int depth)
{
int dft_left , dft_right;
if(node== NULL) //节点不存在,返回(作为递归的结束条件)
return depth;
else
depth++;//节点存在,层数+1
//递归计算左子节点,返回左节点的最大深度
dft_left = dft(node->left,depth) ;
//递归计算右节点,返回右节点的最大深度
dft_right = dft(node->right,depth);
//返回两个子节点最大深度的最大值
return dft_left > dft_right ? dft_left:dft_right;
}