二叉树的深度
题目链接:http://dsalgo.openjudge.cn/binarytree/11/
- 总时间限制: 1000ms 内存限制: 65535kB
- 描述
-
给定一棵二叉树,求该二叉树的深度
二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度
- 输入
- 第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从1到n,根结点为1,n <= 10
接下来有n行,依次对应二叉树的n个节点。
每行有两个整数,分别表示该节点的左儿子和右儿子的节点编号。如果第一个(第二个)数为-1则表示没有左(右)儿子 - 输出
- 输出一个整型数,表示树的深度
- 样例输入
-
3 2 3 -1 -1 -1 -1
- 样例输出
-
2
分析:
这个题关键是要能够想到一个比较方便的存储二叉树的结构。构造好二叉树后,计算深度的话,广搜或深搜都可以。
深搜:

1 #include <stdio.h> 2 int n,a[102][3];//a[i][0]表示节点i的左孩子节点编号,a[i][1]表示节点i的右孩子节点编号;a[i][2]表示i节点的父节点编号。 3 int dfs(int root)//返回根节点编号为root的二叉树的高度 4 { 5 if(a[root][0]==-1&&a[root][1]==-1) return 1; 6 else 7 { 8 int leftHeight=0,rightHeight=0; 9 if(a[root][0]>0) leftHeight=dfs(a[root][0]); 10 if(a[root][1]>0) rightHeight=dfs(a[root][1]); 11 return (leftHeight>rightHeight?leftHeight:rightHeight)+1; 12 } 13 } 14 int main() 15 { 16 freopen("data.in","r",stdin); 17 int i,x,y; 18 scanf("%d",&n); 19 for(i=1;i<=n;i++) 20 { 21 scanf("%d%d",&x,&y); 22 if(x>0) 23 { 24 a[i][0]=x;//i的左孩子是x 25 a[x][2]=i;//x的父节点是i 26 } 27 if(y>0) 28 { 29 a[i][1]=y;//i的右孩子是y 30 a[y][2]=i;//y的父节点是i 31 } 32 } 33 int ans=dfs(1); 34 printf("%d\n",ans); 35 return 0; 36 }
广搜:

1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 5 int n,a[102][3];//a[i][0]表示节点i的左孩子节点编号,a[i][1]表示节点i的右孩子节点编号;a[i][2]表示i节点的父节点编号。 6 struct obj 7 { 8 int ID;//节点编号 9 int leval;//节点所在的层 10 }; 11 int bfs(int root)//用广搜的方式计算并返回根节点编号为root的二叉树的高度 12 { 13 struct obj ttt,t2; 14 queue<struct obj> que; 15 16 17 ttt.ID=root; 18 ttt.leval=1; 19 que.push(ttt); 20 int maxHeight=1; 21 while(!que.empty()) 22 { 23 ttt=que.front();que.pop(); 24 25 if(a[ttt.ID][0]>0) 26 { 27 t2.ID=a[ttt.ID][0]; 28 t2.leval=ttt.leval+1; 29 que.push(t2); 30 if(t2.leval>maxHeight) maxHeight=t2.leval; 31 } 32 if(a[ttt.ID][1]>0) 33 { 34 t2.ID=a[ttt.ID][1]; 35 t2.leval=ttt.leval+1; 36 que.push(t2); 37 if(t2.leval>maxHeight) maxHeight=t2.leval; 38 } 39 } 40 return maxHeight; 41 } 42 int main() 43 { 44 int i,x,y; 45 scanf("%d",&n); 46 for(i=1;i<=n;i++) 47 { 48 scanf("%d%d",&x,&y); 49 if(x>0) 50 { 51 a[i][0]=x;//i的左孩子是x 52 a[x][2]=i;//x的父节点是i 53 } 54 if(y>0) 55 { 56 a[i][1]=y;//i的右孩子是y 57 a[y][2]=i;//y的父节点是i 58 } 59 } 60 int ans=bfs(1); 61 printf("%d\n",ans); 62 return 0; 63 }
C++ STL的queue队列可以参考https://blog.csdn.net/qq_41785863/article/details/81630386
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2017-06-17 7620:区间合并
2017-06-17 2011的n次方