剑指 Offer 32

Posted 清风拂山岗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 32相关的知识,希望对你有一定的参考价值。

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

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

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

    3
   / \\
  9  20
    /  \\
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

提示:

  1. 节点总数 <= 1000

注意:本题与主站 102 题相同:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

思路

golang

采用广度优先遍历BFS,在层序遍历的基础上 将每一层的节点的值保存在一个数组中,最后结果保存在二维数组中。
引入一个queue队列保存遍历的节点,然后依次取出每个节点,将节点的值加入每一层的结果集中,再判断该节点的左右孩子是否不为nil,如果不为nil则再加入queue队列,然后更新队列,将当前节点出队。最后将这一层的结果追加到最终的二维结果集中。

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
/*
在层序遍历的基础上 将每一层的节点的值保存在一个数组中,最后结果保存在二维数组中
引入一个queue队列保存遍历的节点,然后从节点队列中深入获取值
*/
func levelOrder(root *TreeNode) [][]int {
	// 新建一个保存节点值得队列
	var queue []*TreeNode
	// 新建一个用于保存最终结果的值
	var result [][]int

	if root != nil {
		queue = append(queue, root)
	}

	// 开始从节点队列中进行遍历
	for len(queue) != 0 {
		// 新建一个数组保存每一层的节点值
		var res []int
		// 获取
		size := len(queue)
		for i := 0; i < size; i++ {
			node := queue[0]
			res = append(res, node.Val)
			// 排除已经遍历的节点
			queue = queue[1:]

			// 向队列中添加子节点
			if node.Left != nil {
				queue = append(queue, node.Left)
			}

			if node.Right != nil {
				queue = append(queue, node.Right)
			}
		}
		// 向最终结果集中添加每一层的节点值
		result = append(result, res)
	}

	return result
}

以上是关于剑指 Offer 32的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer32-III从上到下打印二叉树

183132I32II32III24

183132I32II32III24

剑指 Offer 32 从上到下打印二叉树IIIIII

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

剑指 Offer 32