Skip to content

Commit 5e15ca8

Browse files
Auto-update blog content
1 parent 96e39ca commit 5e15ca8

File tree

63 files changed

+17287
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+17287
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
---
2+
layout: post
3+
title: "二叉树的最大深度深度优先搜索算法DFSDepth-First-Search"
4+
date: 2024-04-26T16:19:09+0800
5+
description: "左子树的最大深度为2(节点4和2),右子树的最大深度为0(因为它为空)。左子树的最大深度为0(因为它为空),右子树的最大深度为2(节点5和3)。在这个例子中,左子树和右子树的最大深度都是2,所以树的最大深度为3。在这个例子中,左子树的根节点是2,右子树的根节点是3。这是因为节点的深度定义为从根节点到该节点的最长路径的长度。:我们首先检查根节点。,其中height是树的高度,这是因为在递归过程中,我们需要使用栈空间,而栈的深度等于树的高度。:在遍历完整棵树后,我们返回根节点的深度,这就是整棵树的最大深度。"
6+
keywords: "最大深度算法"
7+
categories: ['未分类']
8+
tags: ['深度优先']
9+
artid: "138222517"
10+
arturl: "https://blog.csdn.net/qiuchangxingfiber/article/details/138222517"
11+
image:
12+
path: https://api.vvhan.com/api/bing?rand=sj&artid=138222517
13+
alt: "二叉树的最大深度深度优先搜索算法DFSDepth-First-Search"
14+
render_with_liquid: false
15+
featuredImage: https://bing.ee123.net/img/rand?artid=138222517
16+
featuredImagePreview: https://bing.ee123.net/img/rand?artid=138222517
17+
cover: https://bing.ee123.net/img/rand?artid=138222517
18+
img: https://bing.ee123.net/img/rand?artid=138222517
19+
---
20+
21+
22+
23+
# 二叉树的最大深度(深度优先搜索算法(DFS:Depth-First Search))
24+
25+
26+
27+
求给定二叉树的最大深度,
28+
29+
深度是指树的根节点到任一叶子节点路径上节点的数量。
30+
31+
最大深度是所有叶子节点的深度的最大值。
32+
33+
(注:叶子节点是指没有子节点的节点。)
34+
35+
数据范围:0≤n≤1000000 , 树上每个节点的val满足 ∣val∣≤100
36+
37+
要求: 空间复杂度 O(1),时间复杂度 O(n)
38+
39+
示例1
40+
41+
输入
42+
43+
{1,2}
44+
45+
输出
46+
47+
2
48+
49+
示例2
50+
51+
输入
52+
53+
{1,2,3,4,#,#,5}
54+
55+
输出
56+
57+
3
58+
59+
****#include <algorithm> // 引入algorithm库,用于使用max函数****
60+
61+
****#include <cstddef>   // 引入cstddef库,用于使用NULL和size_t****
62+
63+
****struct TreeNode {    // 定义二叉树的节点结构****
64+
65+
****int val;         // 节点的值****
66+
67+
****TreeNode *left;  // 左子节点****
68+
69+
****TreeNode *right; // 右子节点****
70+
71+
****TreeNode(int x) : val(x), left(NULL), right(NULL) {} // 节点的构造函数****
72+
73+
****};****
74+
75+
****int maxDepth(TreeNode* root) {****
76+
77+
****if (root == NULL) { // 如果节点为空,那么深度为0****
78+
79+
****return 0;****
80+
81+
****} else { // 如果节点不为空****
82+
83+
****int left_depth = maxDepth(root->left);  // 递归计算左子树的最大深度****
84+
85+
****int right_depth = maxDepth(root->right); // 递归计算右子树的最大深度****
86+
87+
****return std::max(left_depth, right_depth) + 1; // 返回左右子树最大深度的较大值+1****
88+
89+
****}****
90+
91+
****}****
92+
93+
以例子{1,2,3,4,#,#,5}为例。
94+
95+
首先,让我们理解一下这个二叉树的结构。这是一个前序遍历的结果,其中"#"表示空节点。所以,这个二叉树的结构如下:
96+
97+
    1
98+
99+
   / \
100+
101+
  2   3
102+
103+
 /     \
104+
105+
4       5
106+
107+
现在,我们来看看如何计算这个二叉树的最大深度。
108+
109+
****初始化****:我们首先检查根节点。如果根节点为空,那么树的最大深度就是0。在这个例子中,根节点是1,所以它不为空。
110+
111+
****递归计算子树的最大深度****:我们分别计算左子树和右子树的最大深度。这是通过递归调用maxDepth函数实现的。在这个例子中,左子树的根节点是2,右子树的根节点是3
112+
113+
对于左子树,我们继续递归计算它的左子树(根节点为4)和右子树(为空)。左子树的最大深度为2(节点4和2),右子树的最大深度为0(因为它为空)。所以,左子树的最大深度为2。
114+
115+
对于右子树,我们继续递归计算它的左子树(为空)和右子树(根节点为5)。左子树的最大深度为0(因为它为空),右子树的最大深度为2(节点5和3)。所以,右子树的最大深度为2。
116+
117+
****计算最大深度****:最后,我们取左子树和右子树最大深度的较大值,然后加1(加上根节点)。在这个例子中,左子树和右子树的最大深度都是2,所以树的最大深度为3。
118+
119+
这个问题的解决方案使用了****深度优先搜索****(Depth-First Search,DFS)算法。
120+
121+
深度优先搜索是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
122+
123+
在这个问题中,我们的目标是找到二叉树的最大深度。我们可以通过深度优先搜索来解决这个问题,具体步骤如下:
124+
125+
****递归****:我们使用递归来实现深度优先搜索。对于每个节点,我们计算它的左子树和右子树的最大深度。
126+
127+
****计算深度****:对于每个节点,其深度等于其左子树和右子树的最大深度加1。这是因为节点的深度定义为从根节点到该节点的最长路径的长度。
128+
129+
****返回结果****:在遍历完整棵树后,我们返回根节点的深度,这就是整棵树的最大深度。
130+
131+
这个算法的时间复杂度是****O(n)****,因为我们访问了每个节点一次。空间复杂度是****O(height)****,其中height是树的高度,这是因为在递归过程中,我们需要使用栈空间,而栈的深度等于树的高度。
132+
133+
这个算法之所以有效,是因为它能够遍历整棵树,并在遍历过程中计算出每个节点的深度。通过比较所有节点的深度,我们就可以找到树的最大深度。
134+
135+
136+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
---
2+
layout: post
3+
title: "第十四届蓝桥杯DFS之飞机降落"
4+
date: 2025-02-28T00:12:44+0800
5+
description: "这道题,由于它的数据范围是非常小的,我们可以采取暴力搜索的措施,把每种情况都枚举出来,如果有能行的情况就返回true。同时我们也要学会剪枝,如果已经确认飞机不能降落,就不要往下再展开了。"
6+
keywords: "5. 飞机降落蓝桥本"
7+
categories: ['未分类']
8+
tags: ['蓝桥杯', '算法', '深度优先']
9+
artid: "145916853"
10+
arturl: "https://blog.csdn.net/2301_81772249/article/details/145916853"
11+
image:
12+
path: https://api.vvhan.com/api/bing?rand=sj&artid=145916853
13+
alt: "第十四届蓝桥杯DFS之飞机降落"
14+
render_with_liquid: false
15+
featuredImage: https://bing.ee123.net/img/rand?artid=145916853
16+
featuredImagePreview: https://bing.ee123.net/img/rand?artid=145916853
17+
cover: https://bing.ee123.net/img/rand?artid=145916853
18+
img: https://bing.ee123.net/img/rand?artid=145916853
19+
---
20+
21+
22+
23+
# 第十四届蓝桥杯:DFS之飞机降落
24+
25+
![](https://i-blog.csdnimg.cn/direct/3f67c27ded374482a04f7b2d144caee8.png)
26+
27+
这道题,由于它的数据范围是非常小的,我们可以采取暴力搜索的措施,把每种情况都枚举出来,如果有能行的情况就返回true
28+
29+
同时我们也要学会剪枝,如果已经确认飞机不能降落,就不要往下再展开了
30+
31+
```
32+
33+
#include <iostream>
34+
#include <vector>
35+
#include <cstring>
36+
const int N = 30;
37+
using namespace std;
38+
39+
int st[N];
40+
int t[N],d[N],l[N];
41+
int n,T;
42+
bool dfs(int pos,int end)
43+
{
44+
if(pos>n)
45+
{
46+
return true;
47+
}
48+
for(int i = 1;i<=n;i++)
49+
{
50+
if(st[i]) continue;
51+
if(end > t[i]+d[i]) continue;
52+
int newend = max(end,t[i])+l[i];
53+
st[i] = true;
54+
if(dfs(pos+1,newend)) return true;
55+
st[i] = false;
56+
57+
}
58+
return false;
59+
}
60+
int main()
61+
{
62+
cin >> T;
63+
while(T--)
64+
{
65+
memset(st,0,sizeof(st));
66+
cin >> n;
67+
for(int i = 1;i<=n;i++)
68+
{
69+
cin >> t[i] >> d[i] >> l[i];
70+
}
71+
if(dfs(1,0)) cout << "YES" << endl;
72+
else cout << "NO" << endl;
73+
}
74+
75+
76+
77+
78+
return 0;
79+
}
80+
```
81+
82+
83+

0 commit comments

Comments
 (0)