树结构
为了更好的讲解广度优先,先带大家看一下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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。