有树如下:
层序遍历就是从左到右一层一层的去遍历二叉树,所以得到的结果是[[1],[2,3],[4,5,6,7]];
队列先进先出的特点很适合用来进行树的层序遍历。
思路
- 将根节点入队。
- 循环判断队列是否为空。如果非空,依次取出当前队列中的所有结点,并将顺序记录。(即某一层的所有结点)
- 在取出某一结点的过程中,要同时判断该结点的左右子树是否非空。如果非空,要将该节点左右子树入队。
- 重复2,3
框架
以leetcode 102为例
框架C++实现如下:
class Solution {
private:
vector<vector<int> > result; //存放结果
queue<TreeNode*> que; //利用队列模拟
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root != NULL) // 1.根节点入队
que.push(root);
// 2.判断队列是否为空,不为空依次取出当前队列内的所有结点
while(!que.empty())
{
int size = que.size();
vector<int> res_; //存储每一层的节点
//本循环一定要使用固定的size,因为que.size()的大小会随着节点的弹出不断变化
for(int i = 0;i < size; i++)
{
TreeNode* node = que.front();
res_.push_back(node->val);
que.pop();
// 3.弹出结点的同时判断左右子树是否非空,非空将其入队
if(node->left)
que.push(node->left);
if(node->right)
que.push(node->right);
}
result.push_back(res_);
}
return result;
}
};
用框架能解决的leetcode题目
-
102.二叉树的层序遍历
-
104.N叉树的最大深度
-
107.二叉树的层次遍历II
-
199.二叉树的右视图
-
637.二叉树的层平均值
-
429.N叉树的层序遍历
-
515.在每个树行中找最大值
-
116.填充每个节点的下一个右侧节点指针
-
117.填充每个节点的下一个右侧节点指针II