-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathleetcode111.cpp
134 lines (125 loc) · 3.83 KB
/
leetcode111.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*************************************************
Author: wenhaofang
Date: 2022-11-09
Description: leetcode111 - Minimum Depth of Binary Tree
*************************************************/
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
using std::vector;
using std::string;
using std::unordered_map;
using std::unordered_set;
using std::stack;
using std::queue;
using std::priority_queue;
using std::max;
using std::min;
using std::swap;
using std::pair;
using std::cin;
using std::cout;
using std::endl;
/**
* 方法一:深度优先搜索
*
* 理论时间复杂度:O(n),其中 n 为节点数量
* 理论空间复杂度:O(m),其中 m 为树的高度
*
* 实际时间复杂度:Runtime: 328 ms, faster than 79.94% of C++ online submissions
* 实际空间复杂度:Memory Usage: 144.6 MB, less than 72.80% of C++ online submissions
*/
// struct TreeNode {
// int val;
// TreeNode *left;
// TreeNode *right;
// TreeNode() : val(0), left(nullptr), right(nullptr) {}
// TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
// TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
// };
// class Solution {
// public:
// int minDepth(TreeNode* root) {
// // 特判
// if (!root) {
// return 0;
// }
// // 递归
// int ld = minDepth(root -> left);
// int rd = minDepth(root -> right);
// if (ld > 0 && rd > 0) {
// return 1 + min(ld, rd);
// } else {
// return 1 + max(ld, rd);
// }
// }
// };
/**
* 方法二:广度优先搜索
*
* 理论时间复杂度:O(n),其中 n 为节点数量
* 理论空间复杂度:O(n),其中 n 为节点数量
*
* 实际时间复杂度:Runtime: 269 ms, faster than 97.81% of C++ online submissions
* 实际空间复杂度:Memory Usage: 144.7 MB, less than 44.84% of C++ online submissions
*/
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
int minDepth(TreeNode* root) {
// 特判
if (!root) {
return 0;
}
// 初始化队列为空
queue<TreeNode*> q;
// 将初始节点加入队列
q.push(root);
// 初始化步数为一
int step = 1;
// 每次取出队列中的所有节点进行处理
// 再把这些节点的左右子节点加入队列
while (!q.empty()) {
int num = q.size();
while (num-- > 0) {
// 当前元素出队
TreeNode* node = q.front(); q.pop();
// 如果满足结束条件,即到达叶节点
// 那么马上返回结果
if (node -> left == nullptr && node -> right == nullptr) { return step; }
// 相邻元素入队
if (node -> left ) { q.push(node -> left ); }
if (node -> right) { q.push(node -> right); }
}
// 步数加一
step++;
}
return -1;
}
};
/**
* 测试
*/
int main() {
Solution* solution = new Solution();
TreeNode* n34 = new TreeNode(7);
TreeNode* n33 = new TreeNode(15);
TreeNode* n22 = new TreeNode(20, n33, n34);
TreeNode* n21 = new TreeNode(9);
TreeNode* n11 = new TreeNode(3, n21, n22);
int ans = solution -> minDepth(n11);
cout << ans << endl;
}