《剑指offer》-逐层打印二叉树

简介: 题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了。先参考milolip的代码,写出这样的solution:class Solution {public: vector Pr...

题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了。

先参考milolip的代码,写出这样的solution:


class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > res;
        if(pRoot==NULL){
            return res;
        }
        
        queue<TreeNode*> Q;
        Q.push(pRoot);
        Q.push(NULL);
        vector<int> v;
        v.push_back(pRoot->val);
        res.push_back(v);
        v.clear();
        while (!Q.empty()){
            TreeNode* node = Q.front();
            Q.pop();
            if (node != NULL){
                //v.push_back(node->val);
                //cout << node->val << ends;
                if (node->left){
                    Q.push(node->left);
                    v.push_back(node->left->val);
                }
                if (node->right){
                    Q.push(node->right);
                    v.push_back(node->right->val);
                }
            }
            else if (!Q.empty()){
                //cout << "test " << endl;
                Q.push(NULL);
                res.push_back(v);
                v.clear();
                //cout << endl;
            }
        }
        return res;
    }
};

上面的代码并不太简洁的样子。

另一种写法是从评论区copy来的,又简洁,又非常直观清晰。两层while的嵌套,正好对应到数的层次遍历以及层内逐点遍历。而这种双层嵌套的循环其实并没有增加复杂度,和原来的复杂度是一样的。

class Solution_11 {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > res;

        if (pRoot == NULL){
            return res;
        }
        
        queue<TreeNode*> q;
        q.push(pRoot);

        while (!q.empty()){
            int lo = 0, hi = q.size();
            vector<int> v;
            while (lo++ < hi){
                TreeNode *t = q.front();
                q.pop();
                v.push_back(t->val);
                if (t->left){
                    q.push(t->left);
                }
                if (t->right){
                    q.push(t->right);
                }
            }
            res.push_back(v);
        }
        return res;
    }
};

测试代码;

void main_solution_11(){
    Solution_11 s = Solution_11();
    TreeNode* a = new TreeNode(8);
    TreeNode* b1 = new TreeNode(6);
    TreeNode* b2 = new TreeNode(10);
    TreeNode* c1 = new TreeNode(5);
    TreeNode* c2 = new TreeNode(7);
    TreeNode* c3 = new TreeNode(9);
    TreeNode* c4 = new TreeNode(1);

    a->left = b1;
    a->right = b2;

    b1->left = c1;
    b1->right = c2;
    b2->left = c3;
    b2->right = c4;

    vector<vector<int> > q = s.Print(a);
    for (int i = 0; i < q.size(); i++){
        for (int j = 0; j < q[i].size(); j++){
            if (j > 0){
                cout << " ";
            }
            cout << q[i][j];
        }
        cout << endl;
    }
}

int main(){
    main_solution_11();
    return 0;
}
目录
相关文章
|
并行计算 算法 C++
统一内存统一内存的基本概念和使用
统一内存统一内存的基本概念和使用
2191 0
统一内存统一内存的基本概念和使用
3GPP相应的5G UDN场景及性能需求 | 带你读《5G UDN(超密集网络)技术详解》之十九
相比 IMT-2020 推进组,3GPP 对 5G UDN 场景的研究更加具有针对性。 在业务应用独立式部署(SA)技术组的研究中,与 UDN 相关的场景都是服务 室内用户的,具体有两种:办公室和热点区域。
3GPP相应的5G UDN场景及性能需求 | 带你读《5G UDN(超密集网络)技术详解》之十九
|
5月前
|
存储 弹性计算 Linux
阿里云服务器的【数据盘】是什么意思?必须买数据盘吗?
阿里云服务器的数据盘是独立于系统盘的存储空间,用于存放用户数据、日志等非系统文件,可根据需求选择是否购买。数据盘类型包括ESSD云盘、ESSD AutoPL等,性能与价格各异,适合不同业务场景。系统盘为必需品,而数据盘则可按需添加,支持挂载至ECS实例并初始化后使用。收费模式有按量付费和包年包月,具体价格因盘型和地域而异。了解更多可参考阿里云块存储官方文档。
|
存储 人工智能 大数据
TDengine 用户大会精彩回顾:AI+数据驱动汽车、能源、烟草、电力应用的未来
TDengine用户大会在京成功举办,聚焦“时序数据助你决胜AI时代”。涛思数据创始人陶建辉携手中科院院士王怀民等业界领袖,探讨时序数据最新进展及AI技术应用。会上发布了《时序大数据平台-TDengine核心原理与实战》一书,为企业与开发者提供宝贵指南。自2019年开源以来,TDengine已拥有57万用户实例,Star数达23.1k。王怀民赞赏TDengine全面创新,立足全球市场。大会还涉及数据库智能化运维、能源行业数字化转型等议题,并设有三大专场,深入讨论海量数据应用、智能制造新能源及新型电力系统,展示了TDengine在各领域的应用潜力与技术革新。
310 0
TDengine 用户大会精彩回顾:AI+数据驱动汽车、能源、烟草、电力应用的未来
|
11月前
|
项目管理
蒙特卡罗分析应用 | 项目管理中的优势
蒙特卡罗分析是一种通过随机抽样预测结果的统计方法,广泛应用于项目管理和工程领域,特别是在大型复杂项目中。它能帮助项目经理更准确地预测项目时间和成本,提供战略支持,但不取代直觉和经验。
209 1
|
11月前
|
机器学习/深度学习 并行计算 调度
CuPy:将 NumPy 数组调度到 GPU 上运行
CuPy:将 NumPy 数组调度到 GPU 上运行
439 1
|
11月前
|
前端开发 开发者 UED
你真的了解 Electron 的自动更新吗?揭秘AppUpdater 类的内部工作原理
本文由前端徐徐首发,深入探讨了 Electron 的自动更新工作原理,特别是 `electron-builder` 中 `AppUpdater` 类的源码分析,涵盖配置更新源、检查更新、下载更新、安装更新及事件通知等核心功能,帮助开发者更好地理解和使用 Electron 的自动更新机制。
604 0
你真的了解 Electron 的自动更新吗?揭秘AppUpdater 类的内部工作原理
|
监控 安全 网络安全
|
移动开发 前端开发 安全
技术心得记录:怎么更快地合成大西瓜?搞懂游戏的源码,闭着眼睛都能成功!
技术心得记录:怎么更快地合成大西瓜?搞懂游戏的源码,闭着眼睛都能成功!
351 0
|
人工智能 测试技术 UED
通义万相文本绘图
阿里云的通义万相是AI文本绘图和人像美化工具,适用于内容创作等多领域。评估其竞争力需考虑成本效益、易用性和应用场景。试用、部署、性能测试和用户反馈是选择的关键步骤。若在成本、用户体验和功能上表现优秀,可推荐给团队。