树结构

为了更好的解说广度优先,先带大家看一下java实现树的树结构

//树结构public class TreeNode {    int val;    TreeNode left;    TreeNode right;    TreeNode() {    }    TreeNode(int val) {        this.val = val;    }    TreeNode(int val, TreeNode left, TreeNode right) {        this.val = val;        this.left = left;        this.right = right;    }}

思路

看到树这种构造,首先思考深度优先,其次能够思考用队列实现的广度优先。

队列版本的广度优先模板

    //广度优先万能模板    while (!queue.isEmpty()) {            TreeNode treeNode = queue.poll();            //以后节点解决逻辑            if (treeNode.left != null) {                queue.add(treeNode.left);            }            if (treeNode.right != null) {                queue.add(treeNode.right);            }        }

做题前先写下这个模板,而后依据题目往里面套,做适当变形即可。

实际

题目

剑指 Offer 32 - II. 从上到下打印二叉树 II

先写模板

      while (!queue.isEmpty()) {            TreeNode treeNode = queue.poll();            //以后节点解决逻辑            if (treeNode.left != null) {                queue.add(treeNode.left);            }            if (treeNode.right != null) {                queue.add(treeNode.right);            }        }

模板变形

首先依据题意补充代码,套入下面的逻辑,造成办法

 public List<List<Integer>> levelOrder(TreeNode root) {        Queue<TreeNode> queue = new LinkedList<>();        if (root == null) {            return new LinkedList<>();        }        queue.add(root);        while (!queue.isEmpty()) {                TreeNode treeNode = queue.poll();                if (treeNode.left != null) {                    queue.add(treeNode.left);                }                if (treeNode.right != null) {                    queue.add(treeNode.right);                }            }        }        return null;    }

其次,思考到题目要求输入后果,那么就用list保留treeNode的值
最初,思考到层序遍历输入后果,while循环外面再嵌套一层逻辑

最终后果

public List<List<Integer>> levelOrder(TreeNode root) {        Queue<TreeNode> queue = new LinkedList<>();        if (root == null) {            return new LinkedList<>();        }        queue.add(root);        List<List<Integer>> lists = new LinkedList<>();        while (!queue.isEmpty()) {            List<Integer> list = new LinkedList<>();            int i = queue.size();            for (int i1 = 0; i1 < i; i1++) {                TreeNode treeNode = queue.poll();                list.add(treeNode.val);                if (treeNode.left != null) {                    queue.add(treeNode.left);                }                if (treeNode.right != null) {                    queue.add(treeNode.right);                }            }            lists.add(list);        }        return lists;    }