• 剑指 Offer 32


    我们可以用广度优先搜索解决这个问题。

    我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。

    考虑如何优化空间开销:如何不用哈希映射,并且只用一个变量 node 表示状态,实现这个功能呢?

    我们可以用一种巧妙的方法修改广度优先搜索:

    • 首先根元素入队
    • 当队列不为空的时候
      • 求当前队列的长度 (s_i)
      • 依次从队列中取 (s_i)个元素进行拓展,然后进入下一次迭代

    它和普通广度优先搜索的区别在于,普通广度优先搜索每次只取一个元素拓展,而这里每次取 (s_i) 个元素。在上述过程中的第 (i) 次迭代就得到了二叉树的第 (i) 层的 (s_i)个元素。

    (i) 次迭代前,队列中的所有元素就是第 (i) 层的所有元素,并且按照从左向右的顺序排列。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            if (!root) return {};
            vector<vector<int>> res;
            queue<TreeNode*> q;
            q.push(root);
            
            while (q.size()) {
                int cnt = q.size();
                vector<int> level(cnt);
                for (int i = 0; i < cnt; i++) {
                    TreeNode* t = q.front();
                    q.pop();
                    
                    level[i] = t->val;
                    if (t->left) q.push(t->left);
                    if (t->right) q.push(t->right);
                }
                res.push_back(level);
            }
            
            return res;
        }
    };
    
  • 相关阅读:
    HTTP 常见状态码
    SpringMVC 入门
    Maven 整合SSH框架
    SSH 框架整合总结
    Maven 整合SSH框架之pom.xml
    Maven 入门
    WebService 综合案例
    CXF 框架
    jQuery高级
    JavaScript补充:BOM(浏览器对象模型)
  • 原文地址:https://www.cnblogs.com/fxh0707/p/15049346.html
Copyright © 2020-2023  润新知