前段时间不知道不知忽然从哪想到一道题:“求二叉树的深度”,于是便试着求了一下。一般看来,这种题目不要太简单了,然而自己算了一会儿,居然没有解决了。

一个非常令人感到迷惑的问题估计就是递归了吧,而递归之中局部变量的值更是令人抓狂不已。

当时我一直迷惑就是用什么来存储高度的值呢?比如这个值在递归的时候,会随递归的层数的增加而增大,那么当递归回溯的时候该怎么办呢?这些值显然不能自减的,于是陷于泥潭。。。

作为一个明智的人来说,就此停止说自己不会这道题显然是愚蠢的。

聪明的人会果断的换个思路,而不是深陷泥潭之中不能自拔。

那么我们已经很清楚了不能使用局部变量了,于是思考还有什么别的方法吗?是的,有的,就是返回值。虽然自己不常用,也不会用这种方法,可是也没有别的方法了(记住不要一直想着自己会的但用不着的方法)。

整体上考虑:每一层递归返回该层往下的最大高度,上一层的最大高度就是下一层的最大高度加1。考虑上一层就是根,那么二叉树的最大高度就是次一层的最大高度加1。很明显,次一层的最大高度不是左子树的高度就是右子树的高度,以此类推,每一层都有这个性质。

If(left>right)

Height
=lift;

Else

Height
=right;

Return Height;

 对不,这个递归的结尾是不是应该就是这个样子的,再来,就是求left,和right的值,而它们都是根据自己的左右结点递归来求的,那么下一步就是往里面加递归了。

Int may_height(Node* head)

{

Node
* p=head;

Int height;

If(p
->left==NULL)return -1;

Else 

Left
= may_height(p->left);

If(p
->right==NULL)return -1;

Else 

right
= may_height(p->right);

If(left
>right)

Height
=lift;

Else

Height
=right;

Return Height;

}

 运用特值代入,求得左右子树为空时,返回-1

OK,完成了!

在上述的分析中,你是不是发现了什么呢?是的,你在想是不是可以用动态规划呢,这样的话,效率会不会高点呢?不如先来看一下程序的执行过程

一开始进入递归后,然后直接到达最左结点,求高度后返回给上层,然后上层计算后再把结果送到再上一层。。。。。。一直到根。

很明显了,并没有出现重复计算子问题的情况。那么DP就发挥不了多大作用了。然而戏剧性的我们发现每次计算时我们又碰巧运用了子问题的解,更像是DP的思想了,或者说他就是DP了吧。。。(DP一般自下而上,而该题自上而下,算是广义的DP~~