从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回:
[3,9,20,15,7]提示:
节点总数 <= 1000
思路:
- 利用队列先进先出的特点(尾进头出)
- 从root开始,不断按层且从左到右的顺序将元素塞入队列
- 注意:每次将当前节点的Val值加入队列后,将以遍历过的当前节点出队
时间复杂度: O(N) ,N 为二叉树的节点数量,即 BFS 需循环 N 次。
空间复杂度: O(N) ,最差情况下,即当树为平衡二叉树时,最多有 N/2 个树节点同时在 queue 中,使用 O(N) 大小的额外空间。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// Go语言版本:
// BFS(利用队列:尾进头出)
func levelOrder(root *TreeNode) []int {
res := make([]int, 0)
if root == nil {
return res
}
queue := []*TreeNode{root} // 开始循环前,先塞入root
for len(queue) > 0 {
root = queue[0] // 获取即将出队的头节点
res = append(res, root.Val)
queue = queue[1:] // 头结点出队
if root.Left != nil {
queue = append(queue, root.Left)
}
if root.Right != nil {
queue = append(queue, root.Right)
}
}
return res
}
C++版本:
void BFS(TreeNode* root)
{
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) // 当队列不为空时
{
root = q.front(); // Gets the head element of the queue
q.pop();
printf("%c", root->data);
if (root->left != NULL)
{
q.push(root->left);
}
if (root->right != NULL)
{
q.push(root->right);
}
}
}
建议按顺序做此三道题:
剑指 Offer 32 - I. 从上到下打印二叉树 本题额外要求:BFS
剑指 Offer 32 - II. 从上到下打印二叉树 II 本题额外要求:每一层打印到一行
剑指 Offer 32 - III. 从上到下打印二叉树 III 本题额外要求:打印顺序交替变化