按行打印二叉树

  1. 题目描述
  2. 思路分析

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路分析

  • 层序遍历,修改一下存储每一层的数据
  • 辅助变量的使用,
    • 当前层的节点数、
    • 下一层的节点数,
    • 当前层输出存储
    • 队列存储每一层的子节点,先左后右
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
  // 队列实现层序遍历
  vector<vector<int> > Print(TreeNode* pRoot) {
      vector<vector<int>> res;
      // 非法判断
      if (pRoot == nullptr) {
          return res;
      }
      // 辅助变量:队列
      queue<TreeNode*> level;
      level.push(pRoot);
      int nextLevel = 0;// 统计某一层的节点数
      int toBePrinted = 1;// 层的节点数,第一层只有一个节点
      vector<int> levelRes;
      // 循环遍历
      while (!level.empty()) {
          // 输出保存
          TreeNode* p = level.front();
          levelRes.push_back(p->val);
          
          // 节点入队
          if (p->left != nullptr) {
              level.push(p->left);
              ++nextLevel;
          }
          
          if (p->right != nullptr) {
              level.push(p->right);
              ++nextLevel;
          }
          // 节点出队
          level.pop();// 队首节点出队
          --toBePrinted;// 当层节点数量剪一
          // 层完结
          if (toBePrinted == 0) {
              // 更新为层节点数量
              toBePrinted = nextLevel;
              //更新下一层的节点数量
              nextLevel = 0;
              
              // 将当层数据保存
              res.push_back(levelRes);
              levelRes.clear();//清除已保存的数据
          }
          
      }
      return res;
  }
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:按行打印二叉树

Count:336

Author:攀登

Created At:2019-12-23, 23:06:29

Updated At:2024-06-15, 15:53:35

Url:http://jiafeimao-gjf.github.io/2019/12/23/sword-print-bTree-by-line/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation