剑指Offer - 九度1350 - 二叉树的深度
2013-11-23 00:54
- 题目描述:
-
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 输入:
-
第一行输入有n,n表示结点数,结点号从1到n。根结点为1。 n <= 10。
接下来有n行,每行有两个个整型a和b,表示第i个节点的左右孩子孩子。a为左孩子,b为右孩子。当a为-1时,没有左孩子。当b为-1时,没有右孩子。
- 输出:
-
输出一个整型,表示树的深度。
- 样例输入:
-
3 2 3 -1 -1 -1 -1
- 样例输出:
-
2
题意分析:
题目要求求出二叉树的深度,也就是根节点到最远叶结点的长度。思路很清楚,DFS。
递归关系为:
max_depth(NULL) = 0;
max_depth(r) = max(max_depth(r->left), max_depth(r->right)) + 1;
实际上由于树的节点个数一开始就指定了,所以直接用数组存数据,用下标当指针就行了,coding更方便。题目中节点数n的数据范围居然只有10,我都怀疑应该是10000或者1000错写成10了。
但有一点要注意,根节点如果不指定为1的话,是需要我们自己去判断哪个是根节点的。对于任何树结构,都只有根节点的入度为零,因为没有节点指向根节点。找出根节点才能去递归。
每个节点遍历一次,时间复杂度O(n)。节点数据都要存起来,空间复杂度O(n)。
1 // 654348 zhuli19901106 1350 Accepted 点击此处查看所有case的执行结果 1020KB 982B 0MS 2 // 201311210410 3 #include <cstdio> 4 using namespace std; 5 6 int mymax(const int &a, const int &b) 7 { 8 return a > b ? a : b; 9 } 10 11 int max_depth(const int a[][2], int r) 12 { 13 if(a == NULL || r < 0){ 14 return 0; 15 } 16 17 return mymax(max_depth(a, a[r][0]), max_depth(a, a[r][1])) + 1; 18 } 19 20 int main() 21 { 22 const int MAXN = 20; 23 int a[MAXN][2]; 24 int in_degree[MAXN]; 25 int i, n; 26 27 while(scanf("%d", &n) == 1){ 28 if(n < 1){ 29 printf("0\n"); 30 continue; 31 } 32 33 for(i = 1; i <= n; ++i){ 34 in_degree[i] = 0; 35 } 36 37 for(i = 1; i <= n; ++i){ 38 scanf("%d%d", &a[i][0], &a[i][1]); 39 if(a[i][0] >= 1 && a[i][0] <= n){ 40 ++in_degree[a[i][0]]; 41 } 42 if(a[i][1] >= 1 && a[i][1] <= n){ 43 ++in_degree[a[i][1]]; 44 } 45 } 46 47 for(i = 1; i <= n; ++i){ 48 if(in_degree[i] == 0){ 49 break; 50 } 51 } 52 printf("%d\n", max_depth(a, i)); 53 } 54 55 return 0; 56 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)