1 题目
2 Java
难点在于一层左到右,一层右到左,交替记录
2.1 方法一(层序遍历,队列+栈,不推荐)
这样会导致无法使用DFS前序递归记录结果,因为前序递归必须是从左往右的,
只能使用BFS队列迭代,且加入栈用于实现右到左
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> listList = new LinkedList<List<Integer>>();
if(root == null) return listList;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
Stack<TreeNode> stack = new Stack<>();
int level = 0;
while(!queue.isEmpty()){
listList.add(new LinkedList<Integer>());
int num = queue.size();
for(int i = 0; i < num; i++){
root = queue.poll();
if(root.left != null) queue.add(root.left);
if(root.right != null) queue.add(root.right);
// 记录右到左的情况
if(level % 2 == 1) stack.push(root);
// 记录左到右的情况
else listList.get(level).add(root.val);
}
// 记录右到左的情况
while(level % 2 == 1 && !stack.isEmpty()){
root = stack.pop();
listList.get(level).add(root.val);
}
level++;
}
return listList;
}
}
2.2 方法二(层序队列迭代+Collections.reverse())
利用Collections.reverse()完成右到左
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> listList = new LinkedList<List<Integer>>();
if(root == null) return listList;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()){
// !!!先添加新的一层
List<Integer> list = new LinkedList<Integer>();
// 处理queue当前所有节点,本次while循环里入队的元素 等下一个while循环处理;即一次处理一层
int num = queue.size();
for(int i = 0; i < num; i++){
// 出队
root = queue.poll();
list.add(root.val);
// 入队
if(root.left != null) queue.add(root.left);
if(root.right != null) queue.add(root.right);
}
// Collections是关键
if(listList.size() % 2 == 1) Collections.reverse(list);
listList.add(list);
}
return listList;
}
}
2.3 方法三(前序递归+递归参数level+Collections.reverse())
正常输出左到右的结果,最后将偶数行翻转一下就行了……
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<List<Integer>> listList = new LinkedList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
helper(root, 0);
for(int i = 0; i < listList.size(); i++){
if(i % 2 == 1) Collections.reverse(listList.get(i));
}
return listList;
}
// 同 面试题32 - II. 从上到下打印二叉树 II;正常的层序遍历递归
public void helper(TreeNode root,int level){
if(root == null) return;
// 比前序遍历就多了这一行!!!如果是新的一层,listList加一个空集合
if(listList.size() == level) listList.add(new LinkedList<Integer>());
// 记录值
listList.get(level).add(root.val);
helper(root.left, level + 1);
helper(root.right, level + 1);
}
}