从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
提示:
节点总数 <= 1000
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof
解题思路:
- 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的广度优先搜索(BFS)。
- BFS 通常借助 队列 的先入先出特性来实现。
算法流程:
- 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环: 当队列 queue 为空时跳出;
- 出队: 队首元素出队,记为 node;
- 打印: 将 node.val 添加至列表 tmp 尾部;
- 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
- 返回值: 返回打印结果列表 res 即可。
*流程分析图*
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
// 定义一个保存tree节点的队列
queue<TreeNode*> nodeQueue;
// 添加将第一层root node最先入队列
if (root != NULL){
nodeQueue.push(root);
}
// 第一个保存tree 各个节点元素的vector,BFS(广度优先搜索,层次扫描tree)
vector<int> result;
// 判断队列是否为空
while (!nodeQueue.empty()){
// 队列元素出列,先进先出
TreeNode *currentNode = nodeQueue.front();
// 删除队顶元素
nodeQueue.pop();
// 将节点值压入vector
result.push_back(currentNode->val);
// 每层节点依次入队列
if (currentNode->left != NULL){
nodeQueue.push(currentNode->left);
}
if (currentNode->right != NULL){
nodeQueue.push(currentNode->right);
}
}
return result;
}
};