求解二叉树的深度(高度)_C语言

来源:互联网 发布:天庭淘宝店无常 编辑:程序博客网 时间:2024/05/17 03:32

http://blog.csdn.net/u010275850/article/details/45955741


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

值,但是其最小值节点依然可能会有右子树,这样深度也就会不断增加。也就是说最大值对应的节点并不等同于右子树的深度,最小值对应的节点并不等同于左子树的深度。

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

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

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.     printf("\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.         T=malloc(sizeof(BinTreeNode));  
  59.         if(T==NULL)  
  60.             printf("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;  

0 0