【算法】从上到下打印二叉树

52 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

题目

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

二叉树广度优先搜索

广度优先算法核心:从根节点开始生成第一层节点,检查目标节点是否在后继节点中,若没有则利用产生式规则则将所有第一层节点扩展以获取第二次节点。然后再检查第二层节点是否存在目标节点。若没有继续扩展出第三层......,依次扩展检查直到找到目标节点为止。二叉树的广度优先搜索无法匹配先中后序遍历任何一种方式,实际上就是按每一层结点进行搜索。

广度优先搜索代码

public void bfs(TreeNode root) {
        if (root == null) {
            return;
        } else {
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                TreeNode node = queue.remove();
                System.out.println(node.val);
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
        }
    }

解题思路

根据题意其实可知上到下打印出二叉树节点实际上就是二叉树广度优先搜索(BFS)。其过程事实就是利用队列能力(先入先出)来实现。

  1. 创建Queue和ArrayList分别存储节点和节点值。
  2. 先将头节点放入队列Queue,然后循环判断Queue是否为空。
  3. 循环体-> Queue出列节点将值放入ArrayList,然后依次将该节点的子树左右节点入队列Queue。
  4. 直到左右节点为空和queue为空位置。
  5. 遍历ArrayList中的值组成数组输出结果。
    public int[] levelOrder(TreeNode root) {
       if(root == null) return new int[0];
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<Integer> list = new ArrayList<>();
        queue.add(root);
        while(queue.size() > 0){
            TreeNode node = queue.poll();
            list.add(node.val);
            // 
            if(node.left != null) queue.add(node.left); // 不为空时
            if(node.right != null) queue.add(node.right); // 不为空时
        }
        int[] values = new int[list.size()];
        int index = 0;
        for(Integer value : list){
                values[index] = value;
                index++;
        }
        return values;
    }

参考