视频讲解:https://www.bilibili.com/video/BV1GY4y1u7b2/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_637-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%B9%B3%E5%9D%87%E5%80%BC
力扣题目:https://leetcode.cn/problems/binary-tree-level-order-traversal/
https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/
https://leetcode.cn/problems/binary-tree-right-side-view/
关于二叉树的层序遍历,需要用到队列这一数据结构,当遍历到一层时,将这一层节点的左节点和右节点压入队列中,然后下一次循环中弹出一个父节点再压入两个子节点,要注意que.size()是随着层数不断变化的。
假设又有个15个元素的4层二叉树
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \ / \ / \
8 9 10 11 12 13 14 15
那么每一次循环的队列元素如下所示:
1
23//1弹出,加入左右节点23
345//2弹出,加入左右节点45
4567//3弹出,加入左右节点67
56789
67891011
...
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode *> que;
if(root!=NULL)
que.push(root);
vector<vector<int>> result;
while(!que.empty())
{
int size = que.size();
//printf("%d\n",size);
vector<int> vec;
for(int i=0;i<size;i++)
{
TreeNode *node=que.front();
que.pop();
vec.push_back(node->val);
if(node->left)
que.push(node->left);
if(node->right)
que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
- 二叉树的层序遍历 II这一题与其类似,只不过要求从下网上遍历,我们只需要将上一题的结果反转即可。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode *> que;
if(root!=NULL) que.push(root);
vector<vector<int>> result;
while(!que.empty())
{
int size=que.size();
vector<int> vec;
for(int i=0;i<size;i++)
{
TreeNode *node=que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(vec);
}
reverse(result.begin(),result.end());
return result;
}
};
- 二叉树的右视图,这一题要求只返回最右边的元素,我们判断便利的元素是否为本行最后一个元素即可。
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode *> que;
if(root!=NULL) que.push(root);
vector<int> result;
while(!que.empty())
{
int size= que.size();
for(int i=0;i<size;i++)
{
TreeNode *node=que.front();
que.pop();
//如果是这一行最后一个元素,就存进去
if(i==size-1) result.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return result;
}
};