二叉树的锯齿形层序遍历

LeetCode每日一题,103. Binary Tree Zigzag Level Order Traversal

先看题目描述

rDnGkQ.png

大意就是给定一棵二叉树,让我们输出二叉树的层次遍历,不过偶数层是从左向右输出,奇数层是从右向左输出

算法和思路

这题用广度优先搜索就可以,用 bfs 对树进行逐层遍历,由于要实现题目要求的锯齿形层次遍历,所以使用栈来维护当前层的所有元素,当栈不为空时,求出当前栈的长度 count,每次从栈中取出 count 个元素进行扩展,然后进行下一轮迭代

需要注意的是,由于栈这个数据结构是后进先出,所以得遍历完上一层的 count 个节点后,再将下一层的节点添加至栈中,因此需要使用一个临时列表

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
int flag = 0;
int count = 0;
Deque<TreeNode> stack = new LinkedList<TreeNode>();
stack.add(root);
while (!stack.isEmpty()) {
count = stack.size();
List<Integer> temp = new ArrayList<>();
List<TreeNode> nodes = new ArrayList<TreeNode>();
if (flag % 2 == 0) {
for (int i = 0; i < count; i++) {
TreeNode cur = stack.removeLast();
temp.add(cur.val);
if (cur.left != null) {
nodes.add(cur.left);
}
if (cur.right != null) {
nodes.add(cur.right);
}
}
} else {
for (int i = 0; i < count; i++) {
TreeNode cur = stack.removeLast();
temp.add(cur.val);
if (cur.right != null) {
nodes.add(cur.right);
}
if (cur.left != null) {
nodes.add(cur.left);
}
}
}
for (TreeNode node : nodes) {
stack.add(node);
}
res.add(temp);
flag++;
}
return res;
}
}

下面是是题解的代码,是用队列来进行层次遍历的,但是对于每一层的节点是使用双端队列的数据结构来维护当前层节点的输出顺序,根据当前层是奇数层还是偶数层来决定把节点放入双端队列的头部还是尾部,然后某层节点遍历完毕时便将存储该层节点的双端队列添加至答案数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ans = new LinkedList<List<Integer>>();
if (root == null) {
return ans;
}

Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
nodeQueue.offer(root);
boolean isOrderLeft = true;

while (!nodeQueue.isEmpty()) {
Deque<Integer> levelList = new LinkedList<Integer>();
int size = nodeQueue.size();
for (int i = 0; i < size; ++i) {
TreeNode curNode = nodeQueue.poll();
if (isOrderLeft) {
levelList.offerLast(curNode.val);
} else {
levelList.offerFirst(curNode.val);
}
if (curNode.left != null) {
nodeQueue.offer(curNode.left);
}
if (curNode.right != null) {
nodeQueue.offer(curNode.right);
}
}
ans.add(new LinkedList<Integer>(levelList));
isOrderLeft = !isOrderLeft;
}

return ans;
}
}