奇怪的字节hr。。。

科技   2024-11-01 10:11   上海  

精品推荐

《征服数据结构》专栏:50多种数据结构彻底征服

《经典图论算法》专栏:50多种经典图论算法全部掌握


奇怪的字节hr,都给人家发邮件通知面试了,结果把人家给删了(这是拉黑还是删除?),网友评论:很多字节的hr都是实习的,实习生离职了当然要删了。如果真是这样,那也太不正规了,直接搞个企业微信,离职之后微信账号继续让其他人来维护就行了。






--------------下面是今天的算法题--------------


来看下今天的算法题,这题是LeetCode的第102题:二叉树的层序遍历。


问题描述



来源:LeetCode第102题
难度:中等

给你二叉树的根节点 root ,返回其节点值的层序遍历 。(即逐层地,从左到右访问所有节点)。


示例 1:


示例1:

输入:root = [3,9,20,null,null,15,7]

输出:[[3],[9,20],[15,7]]

示例2:

输入:root = [1]

输出:[[1]]


  • 树中节点数目在范围 [0, 2000] 内

  • -1000 <= Node.val <= 1000


问题分析



这题是让返回二叉树节点的层序遍历,实际上就是对二叉树进行BFS遍历,关于二叉树的BFS遍历以及使用模板,我们在《算法秘籍》中都有详细的介绍,具体大家可以去看下。

二叉树的BFS遍历一般是配合着队列来使用的,每次遍历队列之前需要先计算队列中元素的个数,这个个数就是当前层节点的个数。因为在遍历二叉树的时候当前层和下一层的部分节点有可能会同时存在于队列中,为了防止把下一层的节点添加到当前层,所以需要先记录。

JAVA:
public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> ans = new LinkedList<>();
    if (root == null)
        return ans;
    Queue<TreeNode> queue = new LinkedList<>();// 创建队列
    queue.offer(root);// 把根节点添加到队列中
    while (!queue.isEmpty()) {
        int levelCount = queue.size();// 每层的节点个数
        // 每层的集合。
        List<Integer> subList = new ArrayList<>();
        // 遍历当前层的所有节点,顺便把下一层的所有节点添加到队列中。
        for (int i = 0; i < levelCount; i++) {
            TreeNode cur = queue.poll();// 节点出队
            subList.add(cur.val);
            // 左右子节点如果不为空就添加到队列中。
            if (cur.left != null)
                queue.offer(cur.left);
            if (cur.right != null)
                queue.offer(cur.right);
        }
        ans.add(subList);// 当前层的集合添加到队列中。
    }
    return ans;
}

C++:
public:
    vector<vector<int>> levelOrder(TreeNode *root) {
        vector<vector<int>> ans;
        if (root == nullptr)
            return ans;
        queue<TreeNode *> q;// 创建队列
        q.push(root);// 把根节点添加到队列中
        while (!q.empty()) {
            int levelCount = q.size();// 每层的节点个数
            // 每层的集合。
            vector<int> subList;
            // 遍历当前层的所有节点,顺便把下一层的所有节点添加到队列中。
            for (int i = 0; i < levelCount; i++) {
                TreeNode *cur = q.front();
                q.pop();// 节点出队
                subList.push_back(cur->val);
                // 左右子节点如果不为空就添加到队列中。
                if (cur->left)
                    q.push(cur->left);
                if (cur->right)
                    q.push(cur->right);
            }
            ans.push_back(subList);// 当前层的集合添加到队列中。
        }
        return ans;
    }

Python:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    ans = []
    if root is None:
        return ans
    q = deque([root])  # 创建队列
    while q:
        levelCount = len(q)  # 每层的节点个数
        # 每层的集合。
        subList = []
        # 遍历当前层的所有节点,顺便把下一层的所有节点添加到队列中。
        for _ in range(0, levelCount):
            cur = q.popleft()  # 节点出队
            subList.append(cur.val)
            # 左右子节点如果不为空就添加到队列中。
            if cur.left:
                q.append(cur.left)
            if cur.right:
                q.append(cur.right)
        ans.append(subList)  # 当前层的集合添加到队列中。
    return ans


笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档


《征服数据结构》专栏

数组稀疏表(Sparse Table)单向链表双向链表块状链表跳表队列和循环队列双端队列单调队列单调栈双端栈散列表字典树(Trie树)ArrayMapSparseArray二叉树二叉搜索树(BST)笛卡尔树AVL树树堆(Treap)FHQ-Treap哈夫曼树滚动数组差分数组LRU缓存LFU缓存

……


《经典图论算法》专栏

图的介绍图的表示方式邻接矩阵转换广度优先搜索(BFS)深度优先搜索(DFS)A*搜索算法迭代深化深度优先搜索(IDDFS)IDA*算法双向广度优先搜索迪杰斯特拉算法(Dijkstra)贝尔曼-福特算法(Bellman-Ford)SPFA算法弗洛伊德算法(Floyd)卡恩(Kahn)算法基于DFS的拓扑排序约翰逊算法(Johnson)

……

数据结构和算法
王一博,《算法秘籍》作者,1000多页的pdf算法题我也已经整理完成,在公众号“数据结构和算法”中回复关键字“pdf”即可下载。
 最新文章