头图

树结构

为了更好的讲解广度优先,先带大家看一下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

image.png

先写模板

      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;
    }

幻想的绝望
1 声望0 粉丝

在绝望中追寻