题目:
以三种方式广度优先遍历二叉树:
三种方式:
1.一行打印
2.多行打印
3.多行之字打印
思路:
-
一行打印:
queue -
多行打印:
1.queue+两个int(一个记录每一行放入的个数,一个记录每行poll后剩余的个数),当pollInt为0时,就换行打印。将offerInt 赋予 pollInt,然后重新计数2.queue,使用fori queue.size进行换行——每次放完某一行后,这一行刚好是queue.size()
-
多行之字打印:
1. 双stack+三int。相比于多行打印,多了一个int,用于判断奇偶性,何时从左到右,何时从右到左。
2. 比方法二多个奇偶性判断即可。可以将二中的结果倒序利用Collections.revers()。也可以用双端队列,放list的时候addlast和addfirst。
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int[] levelOrder(TreeNode root) {
if(root == null) return new int[0];
//bfs
Queue<TreeNode> list = new LinkedList<>();
List<Integer> list1 = new ArrayList<>();
list.add(root);
extracted(list, list1);
int[] array = new int[list1.size()];
for (int i = 0; i < array.length; i++) {
array[i] = list1.get(i);
}
return array;
}
private void extracted(Queue<TreeNode> list, List list1) {
if (list.size() == 0) {
return;
}
TreeNode root = list.poll();
list1.add(root.val);
if (root.left != null) {
list.add(root.left);
}
if (root.right != null) {
list.add(root.right);
}
extracted(list,list1);
}
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 思路,每一个循环都将left和right放入一个新的数组即可
List<List<Integer>> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> secList1 = new ArrayList<>();
queue.add(root);
int changeCount = 1;
int putCount = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
secList1.add(node.val);
changeCount--;
if (node.left != null) {
queue.add(node.left);
putCount++;
}
if (node.right != null) {
queue.add(node.right);
putCount++;
}
if (changeCount == 0) {
list.add(secList1);
secList1 = new ArrayList<>();
changeCount = putCount;
putCount = 0;
}
}
return list;
}
}
- 优化解法:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 思路,每一个循环都将left和right放入一个新的数组即可
List<List<Integer>> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
List<Integer> secList1 = new ArrayList<>();
int length = queue.size();
for(int i = 0 ;i<length;i++){
TreeNode node = queue.poll();
secList1.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
list.add(secList1);
}
return list;
}
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 思路,每一个循环都将left和right放入一个新的数组即可
List<List<Integer>> list = new ArrayList<>();
if (root == null) {
return list;
}
// Queue<TreeNode> = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
List<Integer> secList1 = new ArrayList<>();
stack2.push(root);
int changeCount = 1;
int putCount = 0;
// 多加了一个奇偶性判断
int parity = 0;
while (!stack.isEmpty() || !stack2.isEmpty()) {
TreeNode node;
if ((parity & 1) == 0) {
node = stack2.pop();
} else {
node = stack.pop();
}
secList1.add(node.val);
changeCount--;
if ((parity & 1) == 1) {
if (node.right != null) {
stack2.push(node.right);
putCount++;
}
if (node.left != null) {
stack2.push(node.left);
putCount++;
}
}else {
if (node.left != null) {
stack.push(node.left);
putCount++;
}
if (node.right != null) {
stack.push(node.right);
putCount++;
}
}
if (changeCount == 0) {
parity++;
list.add(secList1);
secList1 = new ArrayList<>();
changeCount = putCount;
putCount = 0;
}
}
return list;
}
}
- 优化后的解法
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 思路,每一个循环都将left和right放入一个新的数组即可
List<List<Integer>> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
LinkedList<Integer> secList1 = new LinkedList<>();
int length = queue.size();
for(int i = 0 ;i<length;i++){
TreeNode node = queue.poll();
if ((list.size() & 1) == 1) {
secList1.addFirst(node.val);
} else {
secList1.addLast(node.val);
}
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
list.add(secList1);
}
return list;
}
}