Skip to content

Commit 1d24095

Browse files
committed
to: 添加注释
1 parent bddd25e commit 1d24095

8 files changed

+78
-47
lines changed

src/tree/complete_binary_tree_inserter.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
class CBTInserter {
77
public:
8+
// 构造函数,初始化根节点和候选节点队列
89
CBTInserter(TreeNode *root) {
910
this->root = root;
1011

1112
queue<TreeNode *> q;
1213
q.push(root);
1314

15+
// 遍历树,将没有左右子节点的节点加入候选节点队列
1416
while (!q.empty()) {
1517
TreeNode *node = q.front();
1618
q.pop();
@@ -26,6 +28,7 @@ class CBTInserter {
2628
}
2729
}
2830

31+
// 插入新节点,返回被替换的节点的值
2932
int insert(int val) {
3033
TreeNode *child = new TreeNode(val);
3134
TreeNode *node = candidate.front();
@@ -40,11 +43,12 @@ class CBTInserter {
4043
return ret;
4144
} // LCOV_EXCL_LINE
4245

46+
// 返回根节点
4347
TreeNode *get_root() { return root; }
4448

4549
private:
46-
queue<TreeNode *> candidate;
47-
TreeNode *root;
50+
queue<TreeNode *> candidate; // 候选节点队列
51+
TreeNode *root; // 根节点
4852
};
4953

5054
/**

src/tree/insert_into_a_binary_search_tree.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// 二叉搜索树中的插入操作
22
// https://leetcode.cn/problems/insert-into-a-binary-search-tree/
33
// INLINE ../../images/tree/insert_into_a_binary_search_tree.jpeg
4+
45
#include <headers.hpp>
56

67
/**
@@ -15,26 +16,28 @@
1516
* right(right) {}
1617
* };
1718
*/
19+
1820
class Solution {
1921
public:
22+
// 插入节点
2023
TreeNode *insertIntoBST(TreeNode *root, int val) {
2124
if (root == nullptr) {
2225
return new TreeNode(val);
2326
}
2427
TreeNode *pos = root;
2528
while (pos != nullptr) {
26-
if (val < pos->val) {
27-
if (pos->left == nullptr) {
29+
if (val < pos->val) { // 待插入节点值小于当前节点值,向左子树寻找插入位置
30+
if (pos->left == nullptr) { // 左子树为空,插入节点
2831
pos->left = new TreeNode(val);
2932
break;
30-
} else {
33+
} else { // 左子树不为空,继续向左子树寻找插入位置
3134
pos = pos->left;
3235
}
33-
} else {
34-
if (pos->right == nullptr) {
36+
} else { // 待插入节点值大于等于当前节点值,向右子树寻找插入位置
37+
if (pos->right == nullptr) { // 右子树为空,插入节点
3538
pos->right = new TreeNode(val);
3639
break;
37-
} else {
40+
} else { // 右子树不为空,继续向右子树寻找插入位置
3841
pos = pos->right;
3942
}
4043
}

src/tree/maximum_difference_between_node_and_ancestor.cpp

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,36 @@
1515
* right(right) {}
1616
* };
1717
*/
18+
1819
class Solution {
1920
public:
20-
pair<int, int> dfs(TreeNode *root, int &max_diff) {
21-
if (root) {
22-
int min_val = root->val, max_val = root->val;
23-
if (root->left) {
24-
auto [left_min, left_max] = dfs(root->left, max_diff);
25-
min_val = min(min_val, left_min);
26-
max_val = max(max_val, left_max);
27-
}
28-
if (root->right) {
29-
auto [right_min, right_max] = dfs(root->right, max_diff);
30-
min_val = min(min_val, right_min);
31-
max_val = max(max_val, right_max);
32-
}
33-
max_diff = max(max_diff, abs(root->val - min_val));
34-
max_diff = max(max_diff, abs(root->val - max_val));
35-
return {min_val, max_val};
36-
} else {
37-
return {INT_MAX, INT_MIN}; // LCOV_EXCL_LINE
21+
// 递归函数,返回以当前节点为根的子树的最小值和最大值
22+
// 同时更新max_diff
23+
pair<int, int> dfs(TreeNode *root, int &max_diff) {
24+
if (root) {
25+
int min_val = root->val, max_val = root->val;
26+
if (root->left) {
27+
auto [left_min, left_max] = dfs(root->left, max_diff);
28+
min_val = min(min_val, left_min);
29+
max_val = max(max_val, left_max);
30+
}
31+
if (root->right) {
32+
auto [right_min, right_max] = dfs(root->right, max_diff);
33+
min_val = min(min_val, right_min);
34+
max_val = max(max_val, right_max);
35+
}
36+
max_diff = max(max_diff, abs(root->val - min_val));
37+
max_diff = max(max_diff, abs(root->val - max_val));
38+
return {min_val, max_val};
39+
} else {
40+
return {INT_MAX, INT_MIN}; // 空节点返回最大值和最小值
41+
}
3842
}
39-
}
4043

41-
int maxAncestorDiff(TreeNode *root) {
42-
int max_diff = 0;
43-
dfs(root, max_diff);
44-
return max_diff;
45-
}
46-
};
44+
// 求最大差值
45+
int maxAncestorDiff(TreeNode *root) {
46+
int max_diff = 0;
47+
dfs(root, max_diff);
48+
return max_diff;
49+
}
50+
};

src/tree/maximum_sum_bst_in_binary_tree.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,23 @@ class Solution {
5353
int ans = 0;
5454
const int inf = 1 << 30;
5555

56+
// dfs函数用于遍历二叉树
5657
function<vector<int>(TreeNode *)> dfs = [&](TreeNode *root) {
5758
if (!root) {
59+
// 如果节点为空,返回一个全为0的vector
5860
return vector<int>{1, inf, -inf, 0};
5961
}
62+
// 递归遍历左右子树
6063
auto l = dfs(root->left);
6164
auto r = dfs(root->right);
6265
int v = root->val;
6366
if (l[0] && r[0] && l[2] < v && v < r[1]) {
67+
// 如果当前节点满足二叉搜索树的条件,更新答案并返回一个包含当前节点信息的vector
6468
int s = l[3] + r[3] + v;
6569
ans = max(ans, s);
6670
return vector<int>{1, min(l[1], v), max(r[2], v), s};
6771
}
72+
// 如果当前节点不满足二叉搜索树的条件,直接返回一个全为0的vector
6873
return vector<int>(4);
6974
};
7075
dfs(root);

src/tree/maximum_width_of_binary_tree.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,36 @@
1414
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
1515
* };
1616
*/
17+
18+
// 解法:二叉树的层序遍历,使用 pair 存储每个节点的 index,index 的计算方法是左子节点 index * 2,右子节点 index * 2 + 1
1719
class Solution
1820
{
1921
public:
2022
int widthOfBinaryTree(TreeNode *root)
2123
{
22-
unsigned long long ans = 1;
23-
vector<pair<TreeNode *, unsigned long long>> arr;
24-
arr.emplace_back(root, 1L);
24+
unsigned long long ans = 1; // 初始化答案
25+
vector<pair<TreeNode *, unsigned long long>> arr; // 使用 pair 存储每个节点的指针和 index
26+
arr.emplace_back(root, 1L); // 将根节点和 index = 1 存入数组中
2527

26-
while (!arr.empty())
28+
while (!arr.empty()) // 一直循环直到数组为空
2729
{
28-
vector<pair<TreeNode *, unsigned long long>> temp;
29-
for (auto &[node, index] : arr)
30+
vector<pair<TreeNode *, unsigned long long>> temp; // 创建临时数组
31+
for (auto &[node, index] : arr) // 遍历当前数组的所有节点
3032
{
31-
if (node->left)
33+
if (node->left) // 如果有左子节点
3234
{
33-
temp.emplace_back(node->left, index * 2);
35+
temp.emplace_back(node->left, index * 2); // 将左子节点和新的 index 存入临时数组
3436
}
3537

36-
if (node->right)
38+
if (node->right) // 如果有右子节点
3739
{
38-
temp.emplace_back(node->right, index * 2 + 1);
40+
temp.emplace_back(node->right, index * 2 + 1); // 将右子节点和新的 index 存入临时数组
3941
}
4042
}
41-
ans = max(ans, arr.back().second - arr[0].second + 1);
42-
arr = move(temp);
43+
ans = max(ans, arr.back().second - arr[0].second + 1); // 更新最大宽度
44+
arr = move(temp); // 将临时数组赋值给当前数组,进入下一层循环
4345
}
4446

45-
return ans;
47+
return ans; // 返回最大宽度
4648
}
4749
};

src/tree/path_sum.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,22 @@
1515
* right(right) {}
1616
* };
1717
*/
18+
1819
class Solution {
1920
public:
21+
// 判断是否存在从根节点到叶子节点路径和为目标值的路径
2022
bool hasPathSum(TreeNode *root, int targetSum) {
23+
// 空树不满足条件,返回 false
2124
if (root == nullptr) {
2225
return false;
2326
}
2427

28+
// 只有一个根节点,判断根节点的值是否等于目标值
2529
if (root->left == nullptr && root->right == nullptr) {
2630
return targetSum == root->val;
2731
}
2832

33+
// 递归判断左子树和右子树是否有满足条件的路径
2934
return hasPathSum(root->left, targetSum - root->val) ||
3035
hasPathSum(root->right, targetSum - root->val);
3136
}

src/tree/time_needed_to_inform_all_employees.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,29 @@
55

66
class Solution {
77
public:
8+
// 深度优先搜索函数,返回从当前节点通知所有下属所需的最长时间
89
int dfs(vector<vector<int>> &tree, vector<int> &informTime, int root) {
910
int maxTime = 0;
11+
// 遍历当前节点的所有下属
1012
for (int &sub : tree[root]) {
13+
// 递归调用深度优先搜索函数,更新最长时间
1114
maxTime = max(maxTime, dfs(tree, informTime, sub));
1215
}
16+
// 返回当前节点通知下属所需的时间,加上当前节点本身通知所需的时间
1317
return maxTime + informTime[root];
1418
}
19+
20+
// 计算通知所有员工所需的时间
1521
int numOfMinutes(int n, int headID, vector<int> &manager,
1622
vector<int> &informTime) {
23+
// 构建树形结构
1724
vector<vector<int>> tree(n);
1825
for (int i = 0; i < n; ++i) {
1926
if (manager[i] != -1) {
2027
tree[manager[i]].push_back(i);
2128
}
2229
}
30+
// 调用深度优先搜索函数,计算通知所有员工所需的时间
2331
return dfs(tree, informTime, headID);
2432
}
2533
};

test/lib/lib_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 执行编译时间:2023-06-03 11:50:44
1+
// 执行编译时间:2023-06-03 17:24:42
22
#include <gtest/gtest.h>
33
#include <lib.hpp>
44

0 commit comments

Comments
 (0)