开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
Day27 2023/02/03
难度:简单
题目
不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。
数据范围:
0<=节点总数<=1000
-1000<=节点值<=1000
示例
输入:{8,6,10,#,#,2,1}
返回值:[8,6,10,2,1]
思路
本题考查的是二叉树的层序遍历(即从上到下,从左到右),我们可以通过队列来辅助完成这一操作。按照队列先进先出的原则,从左向右依次遍历一行节点,并在访问的时候依次将他们的子节点加入辅助队列(包括将节点数据存入数组中,用做返回值),最终队列中的顺序刚好就是二叉树层序遍历的顺序。
具体步骤:
- 首先做二叉树的判空操作,若为空则返回空数组。
- 建立一个辅助队列,从二叉树的根节点开始按照层序遍历的规则开始遍历,首次将根节点的数据存入数组中。
- 从根节点开始,每次遍历都判断该节点是否存在左右节点若存在则存入辅助队列。
知识点
- 队列是一种操作受限的数据结构,仅允许在队头删除元素,对位插入元素,并遵从节点的先进先出原则。
算法实现
c++代码实现-层序遍历(辅助队列)
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> res;
if (!root)
//如果是空,则直接返回空数组
return res;
//队列存储,进行层次遍历
queue<TreeNode*> q;
q.push(root); //无论怎样首先存入根节点
TreeNode* cur; //中间节点,用来暂存节点
while (!q.empty()) {
cur = q.front();
q.pop();
res.push_back(cur->val); //存入节点数据
//若是左右孩子存在,则存入左右孩子作为下一个层次
if (cur->left)
q.push(cur->left); //先存左孩子
if (cur->right)
q.push(cur->right); //在存右孩子
}
return res;
}
};
- 时间复杂度 --- 遍历二叉树的所有节点,n为二叉树的节点数
- 空间复杂度 --- 每次存储二叉树一层的节点数,最坏情况下存储n个节点
总结
- 除了使用辅助队列的方式实现二叉树的层序遍历,还可以使用递归的方式。