【数据结构与算法】二叉树深度

👨‍💻 关于作者:会编程的土豆

"不是因为看见希望才坚持,而是坚持了才看见希望。"

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚 正在更新中的专栏:

💕作者简介:后端学习者

1.

cpp 复制代码
#include<iostream>
using namespace std;
const int MAXN = 1e6 + 5;
int leftchild[MAXN];
int rightchild[MAXN];
int n;
int getdepth(int node)
{
	if (node == 0) return 0;
	int leftdepth = getdepth(leftchild[node]);
	int rightdepth = getdepth(rightchild[node]);
	return max(leftdepth, rightdepth)+1;
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> leftchild[i] >> rightchild[i];
	}
	int ans = getdepth(1);
	cout << ans;
	return 0;
}

用数组表示二叉树并求最大深度:从原理到代码一篇讲透

这道题是二叉树最基础、也是最重要的能力之一:

👉 求二叉树的最大深度(高度)

你这份代码写法很典型:数组建树 + 递归DFS求深度

这篇文章我帮你把每一部分都讲清楚,保证你不仅会写,还知道为什么这么写。


一、问题本质

输入:

复制代码
n(节点个数)
接下来 n 行:
每个节点的 左孩子 和 右孩子

例如:

复制代码
5
2 3
4 5
0 0
0 0
0 0

表示:

复制代码
1
├── 2
│   ├── 4
│   └── 5
└── 3

二、数组建树(核心思想)

复制代码
int leftchild[MAXN];
int rightchild[MAXN];

含义

复制代码
leftchild[i]  → 节点 i 的左孩子
rightchild[i] → 节点 i 的右孩子

关键点

复制代码
用"编号"代替指针

特殊值

复制代码
0 表示:没有子节点(空节点)

三、什么是树的深度?

定义:

复制代码
从根节点到最远叶子节点的路径长度

举例

复制代码
      1
     / \
    2   3
   /
  4

最大深度:

复制代码
3

四、核心函数解析(DFS)

复制代码
int getdepth(int node)
{
    if (node == 0) return 0;

    int leftdepth = getdepth(leftchild[node]);
    int rightdepth = getdepth(rightchild[node]);

    return max(leftdepth, rightdepth) + 1;
}

这段代码在干什么?

一句话:

复制代码
递归计算左右子树深度,取最大值 + 1

执行逻辑拆解


递归终止条件

复制代码
if (node == 0) return 0;

空节点深度为 0


递归计算左右子树

复制代码
int leftdepth = getdepth(leftchild[node]);
int rightdepth = getdepth(rightchild[node]);

返回当前节点深度

复制代码
return max(leftdepth, rightdepth) + 1;

当前节点 = 子树最大深度 + 自己这一层


五、完整执行流程(举例)

树:

复制代码
1
├── 2
│   ├── 4
│   └── 5
└── 3

计算过程

复制代码
getdepth(1)
→ max(getdepth(2), getdepth(3)) + 1

getdepth(2)
→ max(getdepth(4), getdepth(5)) + 1

getdepth(4) → 1
getdepth(5) → 1

getdepth(2) → 2
getdepth(3) → 1

最终:3

六、主函数解析

复制代码
for (int i = 1; i <= n; i++)
{
    cin >> leftchild[i] >> rightchild[i];
}

含义

复制代码
节点编号就是 1 ~ n
默认根节点是 1

求答案

复制代码
int ans = getdepth(1);

七、时间复杂度

复制代码
O(n)

原因:

复制代码
每个节点只访问一次

八、空间复杂度

复制代码
O(n)

来源:

  • 递归栈

  • 数组存储


九、常见错误


1. 忘记处理 node == 0

会导致:

复制代码
递归爆炸 / 访问非法

2. 根节点写错

复制代码
getdepth(1);

👉 前提是:题目保证 1 是根


3. 输入理解错误

复制代码
输入的是"编号",不是值

十、进阶写法(非递归 BFS)

如果不想用递归,也可以用层序遍历:

复制代码
// 用队列按层遍历,统计层数

适合:

复制代码
防止递归爆栈

十一、一句话总结

复制代码
树的深度 = max(左子树深度, 右子树深度) + 1
相关推荐
wabs6668 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing9 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi20269 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog9 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt11 小时前
自制交叉线路识别算法
算法
手写码匠11 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区12 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人13 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin0313 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC13 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode