力扣-102-二叉树的层次遍历

102-二叉树的层次遍历

使用队列实现
思路:

  1. 将根节点的指针插入到队中
  2. 当队列不为空则(循环)
    队首元素出栈,并访问其指向的节点
    若当前节点的左/右孩子不为空,则将其指针依次入队

代码如下:

class Solution
{
public:
  vector<vector<int>> levelOrder(TreeNode *root)
  {

      // 声明一个用于保存结果的二维数组
      vector<vector<int>> ret;
      if (!root)
      {
          return ret;
      }
      // 定义一个队列
      queue<TreeNode *> q;
      q.push(root);

      // 1. 将根节点指针插入队列
      // 怎么记录它的层次?
      while (!q.empty())
      {
          int currentLevelSize = q.size(); // 当前队列的长度
          // 其实就是上一个循环中向队列中插入元素的数量
          // 并且每一次循环都会清空当前队列中的元素
          // 代表了当前层的元素数量
// 为什么能代表?感觉首先是上面的两个特性,在每一次循环开始前读取,并且在每一次循环结束前清空读取到数量的元素,那么就保证了每一次读到的都是上一次循环新插入的元素数量
// 又初始化为根节点的第一层1个
// 每次都会把父节点全部弹出,新获取到的是父节点的子节点数量,即:下一层的元素个数
          ret.push_back(vector<int>());    // 向二位數組中插入一個空的
          // 这里是怎么保证二叉树每一层的?
          for (int = 1; i <= currentLevelSize; ++i)
          {
              auto node = q.front();
              q.pop();

              ret.back().push_back(node->val);
  			// 因爲ret是一个二维数组,所以back返回的是一个一维数组
              if (!node->left.empty())
              {
                  q.push(node->left);
              }
              if (!node->right.empty())
              {
                  q.push(node->right);
              }
          }
      }
      return ret;
  }
};

与《剑指Offer》-32:“从上到下打印二叉树”如出一辙,都是二叉树的层次遍历,但是剑指Offer这题要求打印的是一个一维数组,降低了难度,与之相对的则是它用到了deque,双向队列,多了一个头插方法

posted @ 2022-03-30 19:05  YaosGHC  阅读(43)  评论(0)    收藏  举报