1.进行合法性判断,也是递归结束的条件 
2.递归求出左子树的高度 
3.递归求出右子树的高度 
4.比较左右两边高度大小,选择大的那个加上“根”节点,这里的根是相对于每一个子树/节点的。 
5.返回最后的高度

int Depth(BiTNode * T)
{
    int ret = 0;
    int dep_left = 0, dep_right = 0;
    if (T == NULL)
    {
        ret = 0;
        return ret;
    }

    dep_left = Depth(T->lchild);
    dep_right = Depth(T->rchild);

    ret = 1 + (dep_left>dep_right?dep_left:dep_right);

    return ret;
}






这是在阿里面试的一道题,刚开始感觉不是很难。于是按查找最大值和最小值的方法计算二叉树的深度。结果发现这俩个根本不是一回事。即使你不断遍历左子树,找到了最小

最大值对应的节点并不等同于右子树的深度,最小值对应的节点并不等同于左子树的深度。

面试结果也就可想而知了。

其实拿到这道题,首先想到的应该是采用递归算法。递归算法就得明确两点:

1、基准情形:空树返回-1;

2、递归形式:若不是空树,比较它的左子树深度和右子树深度,返回较大深度值加1,即:return (rightdep>leftdep) ? rightdep+1 : leftdep+1;

编程示例如下:


[cpp]  
   view plain 
    copy 
   
 
   
 
    
 
1. #include<stdio.h>  
2. #include<stdlib.h>  
3. #define N 10  
4.   
5. typedef struct BinTreeNode  
6. {  
7. int data;  
8. struct BinTreeNode *left;  
9. struct BinTreeNode *right;  
10. }BinTreeNode,*BinTree;  
11.   
12. BinTree insert(BinTree T,int data);//二叉树节点的添加  
13. int TreeDepth(BinTree T);//返回树的深度(高度)  
14.   
15. int main()  
16. {  
17. int i=0;  
18. int data[N]= {20, 15 ,10, 12, 18, 25, 30,16,17,18};  
19.     BinTreeNode *root=NULL;  
20. int Depth=0;  
21.   
22. for(i=0;i<N;i++)  
23.     {  
24.         root=insert(root,data[i]);  
25.     }  
26.   
27.     Depth=TreeDepth(root);  
28. "\nTree Depth is %d.\n",Depth);  
29.     free(root);  
30. return 0;  
31. }  
32. //注意理解递归  
33. int TreeDepth(BinTree T)  
34. {  
35. int rightdep=0;  
36. int leftdep=0;  
37.   
38. if(T==NULL)  
39. return -1;  
40.   
41. if(T->left!=NULL)  
42.         leftdep=TreeDepth(T->left);  
43. else  
44.         leftdep=-1;  
45.   
46. if(T->right!=NULL)  
47.         rightdep=TreeDepth(T->right);  
48. else  
49.         rightdep=-1;  
50.   
51. return (rightdep>leftdep) ? rightdep+1 : leftdep+1;  
52. }  
53.   
54. BinTree insert(BinTree T,int data)  
55. {  
56. if(T==NULL)  
57.     {  
58. sizeof(BinTreeNode));  
59. if(T==NULL)  
60. "Out of space!\n");  
61. else  
62.         {  
63.             T->data=data;  
64.             T->left=NULL;  
65.             T->right=NULL;  
66.         }  
67.     }  
68. else  
69.     {  
70. if(data<T->data)  
71.             T->left=insert(T->left,data);  
72. else  
73.             T->right=insert(T->right,data);  
74.     }  
75. return T;  
76. }