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. }