链接:
https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
大意:
以‘Z’字形按层次遍历打印二叉树的节点值。例子:
思路:
与上一题思路一样,只不过需要加一个判断当前是从左往右遍历还是从右往左遍历。
这里我使用了个小技巧:构建的是一个链表tmp存储节点值。如果当前层为奇数层(根节点为第一层),则从左往右遍历,即使用尾插法往tmp插入元素;如果当前层为偶数层,则使用头插法往tmp插入元素。
代码:
/**
* 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>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null)
return res;
LinkedList<TreeNode> queue = new LinkedList<>();
TreeNode l = root, ll = root; // l为当前加入到队列的最后一个元素 ll为上一层的最末尾元素
queue.addLast(root);
int layer = 1; // 奇数层为从左往右遍历 偶数层为从右往左遍历
LinkedList<Integer> tmp = new LinkedList<>();
while (!queue.isEmpty()) {
TreeNode node = queue.removeFirst();
// 相当于 layer % 2
if ((layer & 1) == 1)
tmp.addLast(node.val);
else
tmp.addFirst(node.val);
if (node.left != null) {
queue.addLast(node.left);
l = node.left;
}
if (node.right != null) {
queue.addLast(node.right);
l = node.right;
}
if (node == ll) {
res.add(new ArrayList<>(tmp));
tmp = new LinkedList<>();
ll = l;
layer++;
}
}
return res;
}
}
结果:
结论:
效率并不是太高。
最佳:(递归实现)
/**
* 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>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>> ();
helper(root, 0, result);
return result;
}
public void helper(TreeNode root, int height, List<List<Integer>> result) {
if (root == null) {
return;
}
if (height == result.size()) {
result.add(new ArrayList<Integer> ());
}
if (height % 2 == 0) {
result.get(height).add(root.val);
} else {
result.get(height).add(0, root.val);
}
helper(root.left, height + 1, result);
helper(root.right, height + 1, result);
}
}