LeetCode102. 二叉树的层序遍历

文章目录

    • 题目要求:
    • 思路
    • C++代码

题目要求:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

LeetCode102. 二叉树的层序遍历_第1张图片

思路

首先想到的就是

  1. 根节点入队
  2. 取队头元素(出队),把队头节点的左右孩子入队。
  3. 重复

但如何要把每一层分别区分出来?★ 关键

一个一个的出显然无法判断是第几层,所以考虑一层一层地出。

用一个变量levelSize记录该层的节点个数,levelSize = queue.size()

levelSize为0的时候:

1. 本层节点已经出完
2. 下一层节点已经入完

解题思路:

利用一个队列q,然后一个vector,

vector里的每个元素都是一个vector 用于存放每一层的数据

  • 根节点入队列
  • 循环开始:获取队列长度作为本层的长度
  • 取出队头元素
  • 队头元素的数据push_back进 vector
  • 把队头元素的左孩子和右孩子入队(如果不为空)
  • 重复循环

当队列为空的时候,遍历结束

C++代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> q;
        vector<vector<int>> vv;
        //root不为空,入队
        if(root)
        {
            q.push(root);
        }
        while(!q.empty()){
            //本层节点个数
            int levelSize = q.size();
            //本层数据
            vector<int> v;  
            while(levelSize--){
                //取队头,出队
                TreeNode* front = q.front();
                q.pop();
                int val = front->val;
                v.push_back(val);
                //左右孩子入队
                if(front->left)
                    q.push(front->left);
                if(front->right)
                    q.push(front->right);
            }
            //本层走完了,更新vv
            vv.push_back(v);
        }
        return vv;
    }
};

你可能感兴趣的:(LeetCode刷题之路,算法,队列,层序遍历,二叉树)