这是在阿里面试的一道题,刚难道感觉不是很难。于是按查找最大值和最小值的方法计算二叉树的深度。结果发现这俩个根本不是一回事。即使你不断遍历左子树,找到了最小
值,但是其最小值节点依然可能会有右子树,这样深度也就会不断增加。也就是说最大值对应的节点并不等同于右子树的深度,最小值对应的节点并不等同于左子树的深度。
面试结果也就可想而知了。
其实拿到这道题,首先想到的应该是采用递归算法。递归算法就得明确两点:
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; }
时间: 2024-09-28 16:02:16