二叉树的层序遍历
难度:中等
题目描述
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例1
输入: root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例2
输入: root = [1]
输出:[[1]]
示例3
输入: root = []
输出:[]
题解
由题意得,可以利用队列来进行解题,可获得如下步骤
- 将根节点入队,当队列内元素个数不为零,进行如下循环:
- 进行队列元素个数次循环(嵌套第一次循环内)
- 队列出队一个元素,将其添加到列表中,判断其左右子树是否为空
- 如果均为空,则结束本次循环
- 如果有元素,就将其入队
- 队列出队一个元素,将其添加到列表中,判断其左右子树是否为空
- 将列表添加到答案中,并进行下一次循环
- 进行队列元素个数次循环(嵌套第一次循环内)
循环结束后得答案即为所求
想法代码
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null)
{
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution
{
public static void Main(string[] args)
{
TreeNode roots = new TreeNode(3)
{
left = new TreeNode(9),
right = new TreeNode(20)
{
left = new TreeNode(15),
right = new TreeNode(7)
}
};
Solution solution = new Solution();
IList<IList<int>> ans = solution.LevelOrder(roots);
foreach (var a in ans)
{
foreach (var b in a)
{
Console.Write(b + " ");
}
Console.WriteLine();
}
}
public IList<IList<int>> LevelOrder(TreeNode root)
{
IList<IList<int>> ans = new List<IList<int>>();
if (root == null)
{
return ans;
}
Queue<TreeNode> queue = new Queue<TreeNode>();
queue.Enqueue(root);
while (queue.Count > 0)
{
IList<int> tmp = new List<int>();
int count = queue.Count;
for (int i = 0; i < count; i++)
{
TreeNode treeNode = queue.Dequeue();
tmp.Add(treeNode.val);
if (treeNode.left != null)
{
queue.Enqueue(treeNode.left);
}
if (treeNode.right != null)
{
queue.Enqueue(treeNode.right);
}
}
ans.Add(tmp);
}
return ans;
}
}
}
ans.Add(tmp);
}
return ans;
}
}