系列综述:
目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:材料主要源于【CodeTopHot200】进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证,所有代码均优先参考最佳性能。
结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢!!!
【C++】秋招&实习面经汇总篇
点此到文末惊喜↩︎
// 递归参数,如果需要修改要进行引用传递
void traversal(TreeNode* cur, vector<vector<int>>& result, int depth) {
// 递归出口
if (cur == nullptr) return;
// 递归体
if (result.size() == depth) // 扩容
result.push_back(vector<int>());// 原地构建数组
result[depth].push_back(cur->val);// 顺序压入对应深度的数组中
order(cur->left, result, depth + 1);
order(cur->right, result, depth + 1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
// 初始化:一般为递归形参
vector<vector<int>> result;
int depth = 0;
// 递归调用
traversal(root, result, depth);
// 返回结果
return result;
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res; // 结果容器
queue<TreeNode*> que; // 队列
if (root != nullptr) que.push(root);// 根非空入队
while (!que.empty()) {
vector<int> vec; // 每层结果
int size = que.size(); // 记录当前层结点数量
for (int i = 0; i < size; ++i) {
// 先记录后修改
TreeNode *node = que.front();
que.pop();
// 按序压入每个结点的左右孩子
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
// 每个结点的处理
vec.push_back(node->val);
}
// 每层结点的处理
res.emplace_back(vec);
}
return res;
}
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<int> result;
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
// 将每一层的最后元素放入result数组中
if (i == (size - 1)) result.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return result;
}
// 递归方式(后序遍历的应用模板)
int maxDepth(TreeNode* root) {
auto self = [&](auto &&self, TreeNode *root)->int{
if (root == nullptr) return 0;
int max_left = self(self, root->left);
int max_right = self(self, root->right);
return max(max_left, max_right) + 1;
};
return self(self, root);
}
// 非递归方式
int maxDepth(TreeNode *root) {
int depth = 0; // 结果
queue<TreeNode*> que; // 队列
if (root != nullptr)que.push(root);
while (!que.empty()) {
// 层次遍历
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode *node = que.front();
que.pop();
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
// 层数+1
++depth;
}
return depth;
}
第一个左右孩子均为空
时的depthint minDepth(TreeNode* root) {
// 空二叉树
if (root == NULL) return 0;
// 只有左子树
if (root->left != NULL && root->right == NULL) {
return 1 + minDepth(root->left);
}
// 只有右子树
if (root->left == NULL && root->right != NULL) {
return 1 + minDepth(root->right);
}
// 左右子树都非空
return 1 + min(minDepth(root->left), minDepth(root->right));
}
int minDepth(TreeNode* root) {
if (root == NULL) return 0;
int depth = 0;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()) {
int size = que.size();
depth++; // 记录最小深度
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
if (!node->left && !node->right) { // 第一个左右孩子均空,为最小深度
return depth;
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
}
return depth;
}
int findBottomLeftValue(TreeNode* root) {
TreeNode *res = nullptr;
queue<TreeNode*> que;
if (root != nullptr) que.push(root);
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode *node = que.front();
que.pop();
if (i == 0) res = node; // 每次记录第一个结点
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return res->val;
}
点此跳转到首行↩︎