所谓层次遍历,就是按层次从左往右遍历二叉树。但是一个节点的左子树和右子树之间是没有直接联系方式的。换句话说,当我们遍历了一个节点的左子树的根节点后,无法直接遍历该节点的右子树的根节点。这里我们可以借助一个数据结构,先按一定顺序将节点存放起来,再从该数据结构取出数据,最后得到按层次遍历访问节点的结果。这个数据结构就是队列。直接讲可能有些抽象,我将在代码注释中结合代码详细讲解是如何操作的。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
//存放节点的队列
queue<TreeNode*> que;
//最开始队列为空,先将根节点存入队列
if(root != NULL){
que.push(root);
}
TreeNode* node;
int size;
//队列不为空才可以弹出数据
while(!que.empty()){
vector<int> vec;
//size用来控制每次循环弹出节点的数量,保证一次循环弹出一层的节点数量
size = que.size();
//循环弹出节点
while(size--){
//用一个工作指针一直指向队列的第一个节点,确保在每次弹出第一个节点的同时,将该节点的左右孩子都存入队列(这个操作确保了节点在队列中的存放顺序符合层次遍历)
node = que.front();
//将节点存放的数值放入一维数组
vec.push_back(node -> val);
que.pop();
//将左右孩子存入队列
if(node -> left != NULL) que.push(node -> left);
if(node -> right != NULL) que.push(node -> right);
}
//每结束一个循环,即遍历完一层,最后要放入二维数组中
res.push_back(vec);
}
return res;
}
};
标签:node,遍历,TreeNode,right,que,二叉树,广度,节点,left
From: https://blog.csdn.net/yaodec/article/details/145300903