LeetCode 102. 二叉树的层序遍历的两种解法

本文介绍两种实现二叉树层序遍历的方法:一是采用广度优先搜索策略,通过队列辅助实现;二是利用前序遍历的特性,通过记录节点深度的方式完成遍历。两种方法各有特点,均能有效解决层序遍历问题。

题目概述:

在这里插入图片描述

解法:

一、利用广度优先遍历

  非常显然,如果把树看成一种简化的图,前序遍历就是一种广度优先遍历,那么自然可以按照广度优先遍历的思想实现前序遍历,具体来说,我们需要一个队列q,先检查root是否为空,不为空则让root入队,并且为返回的二维数组容器vec扩容,根据我们后面的设计,会发现q的大小正是二叉树的这一层结点的个数,所以用currentLevelSize=q.size();currentLevelSize = q.size();currentLevelSize=q.size();得到当前层数的节点个数,然后利用一个for循环,从q取队头,pop,把队头对应的值插入到vec.back()的后一个位置,检查队头节点的左孩子不为空则入队列,检查队头结点的右孩子不为空则入队列,这里用back()方法就会得到数组的最后一个元素,也就是对应储存当前层的结点的vector<int>vector<int>vector<int>,这样进行currentLevelSizecurrentLevelSizecurrentLevelSize次,直到队列为空时结束.
  从这里也可以看出,每次都会在for循环中把下一层的结点加入队尾,上一层的结点pop()出队列,所以每次for循环结束,队列的长度正是下一层的结点个数,并且一开始的时候,我们让root入队列,也正好对应了第一层的结点个数是1,不得不说是很巧妙的。
代码:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        vector<vector<int>> vec;
        if (root == nullptr)
        {
            return vec;
        }
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty())
        {
            int currentLevelSize = q.size();
            vector<int> t;
            vec.push_back(t);
            for (int i = 1; i <= currentLevelSize; i++)
            {
                TreeNode* tmp = q.front();
                q.pop();
                vec.back().push_back(tmp->val);
                if (tmp->left != nullptr)
                {
                    q.push(tmp->left);
                }
                if (tmp->right != nullptr)
                {
                    q.push(tmp->right);
                }
            }
        }
        return vec;
    }
};

时间复杂度:O(n)O(n)O(n),n是结点个数
空间复杂度:O(l)O(l)O(l),l是二叉树中一层中结点个数的最大值

二、利用前序遍历实现层序遍历

  这个思想真的很巧妙,我们都知道前序遍历会先访问自己,再访问自己的左孩子,再访问自己的右孩子,我们只要在前序遍历的函数参数中加一个depthdepthdepth控制当前结点对应的深度(这里从0开始记深度)就可以了,进入前序遍历函数后,先检查当前结点是否为空,如果不为空,再检查当前深度depthdepthdepth是否大于等于vector<vector<int>>ansvector<vector<int>> ansvector<vector<int>>ans的大小(或者改为depth+1depth + 1depth+1是否大于当前容器大小,这样更直观),如果是,那么说明当前层还没有来过,需要扩容;以上行动结束后,我们把当前结点的值插入到ans[depth]ans[depth]ans[depth]的最后一个元素,然后去遍历当前结点的左子树和右子树,只不过需要参数depthdepthdepth设置为depth+1depth + 1depth+1
代码:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        vector<vector<int>> vec;
        if (root == nullptr)
        {
            return vec;
        }
        preTraverse(root, 0, vec);
        return vec;
    }
    void preTraverse(TreeNode* root, int depth, 
    vector<vector<int>>& ans)
    {
        if (root == nullptr)
        {
            return;
        }
        if (depth >= ans.size())
        {
            //如果深度大于数组的长度 说明这一层还没来过 需要扩容
            ans.push_back(vector<int> {});
        }
        ans[depth].push_back(root->val);
        preTraverse(root->left, depth + 1, ans);
        preTraverse(root->right, depth + 1, ans);

    }
}
55套 土木工程教学楼,实验楼毕业设计(包括设计图纸+计算书+论文文档资料):2841平米,四层中学教学楼(计算书、施组、建筑、结构图).zip3200平米四层职教教学楼(计算书、建筑、结构图).zip3264平米,三层框架教学楼毕业设计(计算书、建筑、结构图).zip3458平米四层活动中心科技楼(计算书、建筑、结构图).zip3725平米,四层培训中心教学楼(计算书、建筑、结构图).zip3965平米,三层框架教学楼毕业设计(计算书、施组、工程量计算、建筑、结构图).zip3969平米四层局部三层教学楼(电算、建筑、结构图、答辩PPT).zip4019平米,四层框架中学教学楼毕业设计(计算书、建筑、结构图).zip4184平米,三层框架教学楼(计算书、施组、部分建筑、结构图).zip4340.75平米,局部五层框架教学楼毕业设计(含计算书,建筑、结构图).zip4371.84平米,四层中学教学楼框架结构(计算书、建筑、结构图).zip4426平米,五层框架教学楼(开题报告、计算书、建筑、结构图).zip4665平米五层教学楼毕业设计(计算书、建筑、结构图).zip4823平米,四层实验楼(计算书、建筑、结构图).zip4层局部3层幼儿园,2315.97平米(计算书、建筑、结构图).zip5185平米五层框架教学楼(计算书、部分建筑、结构图、计算简图).zip5247平米,四层教学楼(计算书、PKPM模型、建筑图、部分结构图).zip5524平米六层带架空层中学教学楼(计算书、实习报告、建筑、结构图).zip5526平米,五层中学教学楼(计算书、施组、建筑、结构图).zip5532平米,四层框架教学楼毕业设计(计算书、部分建筑结构图).zip5627.7平米,五层中学教学楼(含计算书、部分建筑图).zip5880平米,五层教学楼(计算书、建筑、结构图).zip5层4200平米中学教学楼(计算书、施组、建筑、结构图).zip5层实验楼,总建筑面积6760㎡(计算书、建筑、结构图、PKPM计算文件).zip5层高校教学楼毕业设计(计算书、部分结构图).zip5层,2000平米左右框架高中教学楼毕业设计(计算书、建筑、结构图).zip6062平米,7层框架教学楼(计算书、建筑、结构图、中英文翻译).zip6196平米五层中学教学楼(计算书、建筑、结构图).zip6244.52平米,局部五层辅助教学楼(计算书、建筑、结构图).zip6294平米五层框架中学教学楼(计算书、部分建筑、结构图).zip6447.74平米,五层框架高中教学楼(计算书、建筑、结构图).zip6745平米,四层框架教学楼毕业设计(计算书、建筑结构图、毕业答辩PPT).zip6812平米五层高职教学楼(计算书、部分建筑、结构图).zip6层框架凹字形教学楼毕业设计(计算文件、部分建筑、结构图).zip6层,5283平米框架教学楼毕业设计(计算书、建筑、结构图).zip7144平米,五层局部三层技工实验楼(计算书、部分建筑结构图).zip7567平米五层局部四层职业学院教学楼(计算书、建筑、结构图).zip8层,11305.82平米大学实验楼(计算书、部分建筑、结构图).zip局部6层特警训练大楼5523平米(计算书、建筑、结构图).zip局部6层,2868平米教学楼毕业设计(计算书、建筑、结构图).zip总建筑面积为3773.6平米,5层教学楼(计算书、建筑、结构图).zip某3层教学楼全套设计(4184平,含计算书,建筑图、结构图,施工组织设计).zip某3层教学楼全套设计(约4000平,含计算书,建筑图,结构图,施工组织设计,工程量计算书).zip某4层中学教学楼全套设计(2700平左右,含计算书,建筑图,结构图).zip某4层中学教学楼全套设计(2726.4平,含任务书,计算书,建筑图, 结构图).zip某4层中学教学楼全套设计(含计算书,建筑图、结构图).zip某4层教学楼全套设计(5000平左右,含任务书,开题报告,计算书,建筑图,结构图,外文翻译).zip某4层教学楼全套设计(7050平,含任务书,计算书,建筑图,结构图).zip某4层教学楼全套设计(7258平,含计算书,建筑图,结构图).zip某4层框架教学楼全套设计(6800平,含计算书,建筑图,结构图,毕业答辩PPT).zip某5层中学教学楼全套设计 (4340平,含计算书,建筑、结构图).zip某5层教学楼全套设计 (4665平,含计算书、建筑图,结构图).zip某6层中学教学楼设计(含任务书,开题报告,实习报告,计算书,建筑图,结构图).zip某6层教学楼全套设计(含计算书、建筑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值