剑指 Offer 32 - I. 从上到下打印二叉树(BFS)

剑指 Offer 32 - I. 从上到下打印二叉树

    

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回:

[3,9,20,15,7]

提示:

  1. 节点总数 <= 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        本题额外要求:打印顺序交替变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值