突然想到写这个的原因是在四月份的每日一题里面有一个n叉树的层序遍历,然后自己做的其实不熟练。又想到之前又写过二叉树的层序遍历,所以就想着将几个题目一起总结起来。也算是加深一下印象了。
树的遍历方法一共四种:
先序遍历、中序遍历、后序遍历、层序遍历。
前三种方法中的序是指根节点的遍历顺序,一般使用递归(深度优先遍历)的方法实现。
层序遍历是指从最上层开始,一层一层的从左到右遍历,而不再是先左后右或先右后左。
层序遍历和广度优先搜索的思路比较像,维护一个队列,先将根结点放入队列中,当该结点出队列是,他的孩子结点就入队列。但是这样并不会有明显的分层,而只有一个数组,所以我们还需要记录每一层的结点数量,方便分层。
第一题:二叉树的层序遍历
这个题的思路就和上面说到的层序遍历的思路一样,先将根结点入队列,根结点出队列时将根节点的左右孩子入队列。为了区分每一层,则在每一层遍历开始之前记录下这一层的结点数量。将每一层的遍历区分开。
一层遍历的代码如下:
int n=q.size();
vector<int>v;//用于存放结点数值的数组
while(n--){
TreeNode*p=q.front();
q.pop();
v.emplace_back(p->val);
if(p->left)
q.push(p->left);
if(p->right)
q.push(p->right);
}
result.emplace_back(v);
参考代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root)
return {
};
vector<vector<int>>result;
queue<TreeNode*>q;//队列,用于存放根节点
q.push(root);
while(!q