问题:
难度:easy
说明:
输入一个二叉树,然后Z型遍历,就是先一次正向遍历,然后再一次反向遍历,如此类推。
问题链接:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
相关问题:
Binary Tree Level Order Traversal & Binary Tree Level Order Traversal II(遍历二叉树):https://blog.csdn.net/qq_28033719/article/details/107104863
输入案例:
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
我的代码:
其实也是遍历而已,用双栈(滚动数组)最快,毕竟使用 BFS 处理,然后就100%RT。
class Solution {
// 双栈指针
private static int cur = 1;
private static int pre = 0;
// 两个栈各自的 top 标记
private static int curTop = 0;
private static int preTop = 0;
// 弄个滚动数组
private static TreeNode[][] towStack = new TreeNode[2][(int)Math.pow(2,11)];
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
// 顺序遍历标记, true 正向, false 反向
boolean dir = true;
// 结果集
List<List<Integer>> res = new ArrayList<List<Integer>>();
// 加入队列
if(root != null) towStack[cur][curTop ++] = root;
// 然后一样进行遍历处理即可
while(curTop != 0) {
List<Integer> list = new ArrayList<Integer>();
int size = curTop;
if(dir)
for(int i = size;i -- > 0;) {
TreeNode node = towQueue[cur][i];
list.add(node.val);
if(node.left != null) towStack[pre][preTop ++] = node.left;
if(node.right != null) towStack[pre][preTop ++] = node.right;
}
else
for(int i = size;i -- > 0;) {
TreeNode node = towStack[cur][i];
list.add(node.val);
if(node.right != null) towStack[pre][preTop ++] = node.right;
if(node.left != null) towStack[pre][preTop ++] = node.left;
}
curTop = preTop;
preTop = 0;
dir = !dir;
cur ^= 1;
pre ^= 1;
res.add(list);
}
curTop = 0;
return res;
}
}