完整教程:【代码随想录day 12】 力扣 102.107.199. 二叉树的层序遍历

视频讲解: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;
  }
  };
  1. 二叉树的层序遍历 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;
  }
  };
  1. 二叉树的右视图,这一题要求只返回最右边的元素,我们判断便利的元素是否为本行最后一个元素即可。
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;
  }
  };
posted @ 2025-08-11 08:41  yfceshi  阅读(15)  评论(0)    收藏  举报