题目描述
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]
示例 2:
输入: root = [1]
输出: [[1]]
示例 3:
输入: root = []
输出: []
提示:
- 树中节点数目在范围 [0, 2000] 内
- -1000 <= Node.val <= 1000
代码及注释
/*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/func levelOrder(root *TreeNode) [][]int {// 初始化结果数组和当前层的节点值数组var res [][]intvar ans []int// 定义一个栈用于存储当前层的节点var stack []*TreeNode// 如果根节点为空,直接返回空数组if root == nil {return res}// 将根节点入栈stack = append(stack, root)// 开始层序遍历for len(stack) > 0 {// 获取当前层的节点数量length := len(stack)// 遍历当前层的所有节点for i := 0; i < length; i++ {root = stack[i]// 将当前节点的值加入到当前层的节点值数组ans = append(ans, root.Val)// 如果当前节点有左子节点,将左子节点入栈if root.Left != nil {stack = append(stack, root.Left)} // 如果当前节点有右子节点,将右子节点入栈if root.Right != nil {stack = append(stack, root.Right)}}// 将当前层的节点值数组加入到结果数组res = append(res, ans)// 重置当前层的节点值数组ans = []int{}// 更新栈,去除已经遍历的当前层节点stack = stack[length:]}// 返回结果数组return res
}
代码解释
-
初始化:首先,我们初始化一个空的二维数组
res
用于存储结果,一个空的数组ans
用于存储当前层的节点值,以及一个栈stack
用于存储当前层的节点。 -
判断根节点:如果根节点为空,直接返回空的结果数组。
-
层序遍历:
- 使用一个
for
循环遍历栈中的节点,直到栈为空。 - 在每一次迭代开始时,我们获取当前栈的长度,这是为了遍历当前层的所有节点。
- 在内部的
for
循环中,我们将当前节点的值添加到ans
数组中,并将其左右子节点(如果存在)添加到栈中。 - 将
ans
数组添加到res
数组中,表示当前层的节点值。 - 重置
ans
数组为一个空数组,以便下一层使用。 - 更新栈,去除已经遍历的当前层的节点。
- 使用一个
-
返回结果:返回层序遍历的结果
res
。