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;
编程示例如下:
- #include<stdio.h>
- #include<stdlib.h>
- #define N 10
-
- typedef struct BinTreeNode
- {
- int data;
- struct BinTreeNode *left;
- struct BinTreeNode *right;
- }BinTreeNode,*BinTree;
-
- BinTree insert(BinTree T,int data);
- int TreeDepth(BinTree T);
-
- int main()
- {
- int i=0;
- int data[N]= {20, 15 ,10, 12, 18, 25, 30,16,17,18};
- BinTreeNode *root=NULL;
- int Depth=0;
-
- for(i=0;i<N;i++)
- {
- root=insert(root,data[i]);
- }
-
- Depth=TreeDepth(root);
- printf("\nTree Depth is %d.\n",Depth);
- free(root);
- return 0;
- }
-
- int TreeDepth(BinTree T)
- {
- int rightdep=0;
- int leftdep=0;
-
- if(T==NULL)
- return -1;
-
- if(T->left!=NULL)
- leftdep=TreeDepth(T->left);
- else
- leftdep=-1;
-
- if(T->right!=NULL)
- rightdep=TreeDepth(T->right);
- else
- rightdep=-1;
-
- return (rightdep>leftdep) ? rightdep+1 : leftdep+1;
- }
-
- BinTree insert(BinTree T,int data)
- {
- if(T==NULL)
- {
- T=malloc(sizeof(BinTreeNode));
- if(T==NULL)
- printf("Out of space!\n");
- else
- {
- T->data=data;
- T->left=NULL;
- T->right=NULL;
- }
- }
- else
- {
- if(data<T->data)
- T->left=insert(T->left,data);
- else
- T->right=insert(T->right,data);
- }
- return T;
- }