这一道题是leetcode102的一道进阶题目,题目大意就是在奇数层进行从左到右的遍历,偶数层进行从右到左的遍历,该题有两种解法,跟leetcode102几乎如出一辙,可以使用dfs,也可以使用bfs。
1.BFS 广度优先遍历,使用队列进行储存每一层的结点,需要创建一个布尔值islefttoright 判断是否是从左到右,首先使用while循环进行判断树不为空的前提下,创建一个linkedlist(因为该集合在进行数据结构首部进行加入元素时,比数组所有元素往后挪一位更好)然后进行遍历quue当中的所有结点,判断islefttoright,如果为真那么就使用普通add方法加入到末尾,如果不是那么使用add(int index,int val)方法加入到数据结构首部,其次就是判断一下该结点是否有左右子节点,有的时候加入到队列中。最后就加入需要返回的res中即可。
List<List<Integer>> res = new ArrayList<>();
private Deque<TreeNode> queue = new ArrayDeque<>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) return res;
queue.add(root);
// 代表是否从左到右进行遍历
boolean isLeftToRight = true;
while(!queue.isEmpty()){
int length = queue.size();
List<Integer> list = new LinkedList<>();
for (int i = 0; i < length; i++) {
TreeNode node = queue.removeFirst();
if (isLeftToRight) list.add(node.val);
else ((LinkedList<Integer>) list).addFirst(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
res.add(list);
isLeftToRight = !isLeftToRight;
}
return res;
}
第二种方法就是使用dfs,实在是不想码字了,就说一下核心的地方吧,主要是使用递归时,使用一个count代表层数,每当重新进入一个递归时,需要加一。