为所有语句添加详细注释
时间: 2024-02-21 20:01:31 浏览: 26
以下是对代码中每个语句的详细注释:
```c++
class Solution {
vector<TreeNode *> ans; // 存储删除节点后的所有根节点
unordered_set<int> s; // 存储待删除节点值的集合
```
定义了一个 Solution 类,并声明了一个成员变量 ans 和一个成员变量 s,用于存储删除节点后的所有根节点和待删除节点值的集合。
```c++
// 递归删除节点
TreeNode *dfs(TreeNode *node) {
if (node == nullptr) return nullptr; // 如果节点为空,返回空指针
node->left = dfs(node->left); // 递归删除左子树
node->right = dfs(node->right); // 递归删除右子树
if (!s.count(node->val)) return node; // 如果该节点的值不在待删除节点值的集合中,直接返回该节点
if (node->left) ans.push_back(node->left); // 如果该节点有左子节点,将其添加到 ans 数组中
if (node->right) ans.push_back(node->right); // 如果该节点有右子节点,将其添加到 ans 数组中
return nullptr; // 返回空指针,表示该节点已被删除
}
public:
// 删除指定节点
vector<TreeNode *> delNodes(TreeNode *root, vector<int> &to_delete) {
for (int x: to_delete) s.insert(x); // 将待删除节点值插入到 s 集合中
if (dfs(root)) ans.push_back(root); // 递归删除节点,并将根节点添加到 ans 数组中
return ans; // 返回 ans 数组
}
};
```
delNodes 函数接受一个二叉树的根节点指针 root 和一个待删除节点值的数组 to_delete,返回一个 vector,包含删除节点后的所有根节点。
dfs 函数是递归删除节点的核心代码。首先判断当前节点 node 是否为空,如果为空则返回空指针。接着,递归调用左右子树的 dfs 函数。如果该节点的值不在待删除节点值的集合中,直接返回该节点。否则,将该节点的左右子节点添加到 ans 数组中,并返回空指针,表示该节点已被删除。
delNodes 函数首先将待删除节点值插入到一个 unordered_set 中,然后调用 dfs 函数进行递归删除。如果 dfs(root) 返回非空指针,则将 root 添加到 ans 数组中,并返回 ans 数组。