二叉树的层序遍历--力扣
一、题目描述
链接:102. 二叉树的层序遍历 - 力扣(LeetCode)
题目:给你二叉树的根节点 root
,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。
提示:
- 树中节点数目在范围
[0, 2000]
内 -1000 <= Node.val <= 1000
示例1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1] 输出:[[1]]
示例 3:
输入:root = [] 输出:[]
二、题解
层序遍历可以直接采用广度优先遍历的思想解决,但是本题对输出结果有特定的要求,需要将每层的数据放在一个二维数组的一行中。因此在遍历二叉树的同时还需要记录数据属于哪一层。遍历时采用队列记录节点。
在记录节点时队列里面最多会记录两层的数据,在第一层节点进入时队列无节点,第一层出队列时第二层近队列,当第一层完全出队列后第二层完全进队列,此时队列就只有第二次的节点,如此循环。因此可以在入队列的时候记录当前层有多少元素,或者在每次一层循环结束时的队列中节点数即可用一个队列完成遍历,如果不想记录可以用两个队列一个存放当前层节点另一个存放下一层节点,当前层为空时一次循环结束,同时将队列进行交换即可完成层数的变换。
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;queue<TreeNode*> q;int levelSize = 0;if(root){q.push(root);}while(!q.empty()){vector<int> v;levelSize = q.size();while(levelSize--){ v.push_back(q.front()->val);if(q.front()->left){q.push(q.front()->left);}if(q.front()->right){q.push(q.front()->right);}q.pop();}vv.push_back(v);}return vv;}
};