https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
解题思路:
这道题是层序遍历的变体,分奇偶层正序或逆序输出每层。
Binary Tree Level Order Traversal 这道题是每一个水平层都是从左至右的遍历,Binary Tree Level Order Traversal II 是将水平层从下至上的输出,而这道题是奇数层从左至右的遍历,偶数层从右至左的遍历,最后水平层从上至下的输出。
这里使用两个栈,通过判断奇偶层来决定节点入栈次序。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
Stack<TreeNode> curr = new Stack<>();
Stack<TreeNode> next = new Stack<>();
if (root == null) return result;
curr.push(root);
int level = 1;
while (!curr.isEmpty()) {
TreeNode node = curr.pop();
if (level % 2 != 0) {
if (node.left != null)
next.push(node.left);
if (node.right != null)
next.push(node.right);
} else {
if (node.right != null)
next.push(node.right);
if (node.left != null)
next.push(node.left);
}
list.add(node.val);
if (curr.isEmpty()) {
curr = next;
next = new Stack<>();
result.add(list);
list = new ArrayList<>();
level++;
}
}
return result;
}
}
从 discuss 里面找到了用标志位的写法,这个写法我自己更喜欢一些~
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean level = true; int size = 1;
while (!queue.isEmpty()) {
List<Integer> list = new ArrayList<>();
for (int i=0; i<size; i++) {
root = queue.poll();
if (level) list.add(root.val);
else list.add(0, root.val);
if (root.left != null)
queue.offer(root.left);
if (root.right != null)
queue.offer(root.right);
}
result.add(list);
size = queue.size();
level = level ? false : true;
}
return result;
}
}