算法与数据结构面试题-2

常见面试题

  1. 说说满二叉树和完全二叉树?⭐⭐⭐⭐⭐

    二叉树还有两种特殊形式, 一个叫作满二叉树, 另一个叫作完全二叉树

    一个二叉树的所有非叶子节点都存在左右孩子, 并且所有叶子节点都在同一层级上, 那么这个树就是满二叉树

    完全二叉树的条件没有满二叉树那么苛刻: 满二叉树要求所有分支都是满的; 而完全二叉树只需保证最后一个节点之前的节点都齐全即可

  2. 说说树的遍历有几种方式?⭐⭐⭐⭐⭐

    树的遍历有四种,前序遍历、中序遍历、后序遍历、层序遍历。

    区别在于访问节点的顺序不同:前序遍历(根-->左-->右)、中序遍历(左-->根-->右)、后序遍历(左-->右-->根)、层序遍历(按层从左至右访问)

  3. 用栈实现一下树的前序遍历,说说思路⭐⭐⭐⭐⭐

    前序遍历,口诀很好记:根-->左-->右。所以根节点先入栈并输出。然后访问左子树,打印完左节点出栈。

    根-->左访问完了,开始访问右,因为我们的栈顶保存了根节点,通过获取栈顶元素,也就可以访问根节点的右边了,所以此时获取根节点后,让根节点出栈。

    重复以上的步骤。直到栈为空,整棵树也就完成输出了。

    class Solution {
    public:
        vector<int> preorderTraversal(TreeNode* root) { // 前序遍历,口诀很好记:根-->左-->右。
            vector<int> res;
            if (root == nullptr) {
                return res;
            }
    
            stack<TreeNode*> stk;
            TreeNode* node = root;
            while (!stk.empty() || node != nullptr) {
                while (node != nullptr) {
                    res.emplace_back(node->val); // 前序遍历,先访问根
                    stk.emplace(node);      
                    node = node->left;           // 接下来进入左子树
                }
                if (!stk.empty()){
                    node = stk.top();
                    stk.pop();
                    node = node->right;          // 接下来进入右子树
                }
            }
            return res;
        }
    };
    // 时间复杂度:O(n)
    // 空间复杂度:O(n)
    
  4. 用队列实现树的层序遍历,说说思路?⭐⭐⭐⭐⭐

    层序遍历,就是一层一层按顺序访问节点。所以根节点先入队列并输出,输出完就要让根节点出队列。然后就判断根节点是否有左右子节点,如果有,就让左右子节点入队列。

    接下来就是依次取队列前面的元素了,取出子节点,让子节点出队并输出子节点,然后判断子节点是否有左右子节点,如果有,就让左右子节点入队列。

    又取出剩余子节点,重复以上步骤,直到队列没有元素可取了,此时整棵树也输出完毕了。

    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            if (root == NULL) return {};
            queue<TreeNode*> que;            // 创建队列
            que.push(root);                  // 根节点先入队
            vector<vector<int>> res;
            while (!que.empty()){
                vector<int> vec;
                int len = que.size();
                for (int i=0; i<len; i++){
                    TreeNode* node = que.front();
                    vec.push_back(node->val);                       // 访问根节点
                    que.pop();                                      // 根节

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>

全部评论
针对第9点,在STL源码剖析中,不是说哈希表的vector大小最好为质数吗?16不是质数啊
1 回复 分享
发布于 2021-08-18 10:57
10负载因子感觉没讲清楚诶
点赞 回复 分享
发布于 2023-01-29 12:10 吉林
12点这里答案写的太白话了吧,作者直接从第三节搬过来
点赞 回复 分享
发布于 2023-01-29 11:55 吉林

相关推荐

2025-11-07 15:41
暨南大学 C++
用微笑面对困难:我面试时候,就说了句”不愧是徐波的兵“他就破房了说是
点赞 评论 收藏
分享
2025-11-04 21:22
天津理工大学 Java
Tom哥981:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务