439,剑指 Offer-从上到下打印二叉树

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
在这里插入图片描述

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


例如:
给定二叉树: [3,9,20,null,null,15,7],
在这里插入图片描述

返回:

[3,9,20,15,7]


提示:

  • 节点总数 <= 1000

BFS解决

其实这就是二叉树的BFS,也可以看下之前讲的373,数据结构-6,树

在这里插入图片描述

就是这样,一层一层打印,使用队列解决

public int[] levelOrder(TreeNode root) {
    if (root == null)
        return new int[0];
    //队列
    Queue<TreeNode> queue = new LinkedList<>();
    List<Integer> list = new ArrayList<>();
    //根节点入队
    queue.add(root);
    while (!queue.isEmpty()) {
        //出队
        TreeNode node = queue.poll();
        //把结点值存放到list中
        list.add(node.val);
        //左右子节点如果不为空就加入到队列中
        if (node.left != null)
            queue.add(node.left);
        if (node.right != null)
            queue.add(node.right);
    }
    //把list转化为数组
    int[] res = new int[list.size()];
    for (int i = 0; i < list.size(); i++) {
        res[i] = list.get(i);
    }
    return res;
}

递归方式解决

其实这题很明显就是二叉树的宽度优先搜索,使用上面代码就对了。实际上我们还可以改一下,改成DFS并且还是递归的,我想除了我应该没人会这么无聊吧,有兴趣的也可以看下

public int[] levelOrder(TreeNode root) {
    List<List<Integer>> list = new ArrayList<>();
    levelHelper(list, root, 0);
    List<Integer> tempList = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        tempList.addAll(list.get(i));
    }

    //把list转化为数组
    int[] res = new int[tempList.size()];
    for (int i = 0; i < tempList.size(); i++) {
        res[i] = tempList.get(i);
    }
    return res;
}

public void levelHelper(List<List<Integer>> list, TreeNode root, int height) {
    if (root == null)
        return;
    if (height >= list.size()) {
        list.add(new ArrayList<>());
    }
    list.get(height).add(root.val);
    levelHelper(list, root.left, height + 1);
    levelHelper(list, root.right, height + 1);
}

总结

这题实际上就是二叉树的宽度优先遍历,一层一层打印。


在这里插入图片描述

posted @ 2020-09-17 21:48  数据结构和算法  阅读(65)  评论(0编辑  收藏  举报