欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

102. 二叉树的层次遍历

程序员文章站 2022-05-20 10:31:14
...

题目

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

分析

将左右节点与层联系到一起,递归或者队列都可以解决

代码

递归
时间复杂度O(N)
空间复杂度O(N)

public class TreeNode
{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int x) { val = x; }
}
public IList<IList<int>> LevelOrder(TreeNode root)
{
    List<IList<int>> list = new List<IList<int>>();//结果数组
    return root == null ? list : LevelOrder(root, 0, list);//如果null就直接返回 否则开始递归
}
private List<IList<int>> LevelOrder(TreeNode node, int level, List<IList<int>> list)
{
    //当前层没有创建数组
    if (list.Count == level)
    {
        list.Add(new List<int>());
    }
    list[level].Add(node.val);//将当前节点的值添加到对应的层
    if (node.left != null)
    {
        list = LevelOrder(node.left, level + 1, list);
    }
    if (node.right != null)
    {
        list = LevelOrder(node.right, level + 1, list);
    }
    return list;
}

2.迭代
时间复杂度O(N)
空间复杂度O(N)

public class TreeNode
{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int x) { val = x; }
}
public IList<IList<int>> LevelOrder(TreeNode root)
{
    List<IList<int>> list = new List<IList<int>>();//结果数组
    if (root == null)
    {
        return list;
    }
    Queue<KeyValuePair<TreeNode, int>> queue = new Queue<KeyValuePair<TreeNode, int>>();//节点 层,数据对组成的队列
    queue.Enqueue(new KeyValuePair<TreeNode, int>(root, 0));//将根节点加入队列中
    while (queue.Count > 0)
    {
        var kvp = queue.Dequeue();
        if (list.Count == kvp.Value)
        {
            list.Add(new List<int>());
        }
        list[kvp.Value].Add(kvp.Key.val);
        if (kvp.Key.left != null)
        {
            queue.Enqueue(new KeyValuePair<TreeNode, int>(kvp.Key.left, kvp.Value + 1));
        }
        if (kvp.Key.right != null)
        {
            queue.Enqueue(new KeyValuePair<TreeNode, int>(kvp.Key.right, kvp.Value + 1));
        }
    }
    return list;
}