二叉树的锯齿形层次遍历
题目链接:二叉树的锯齿形层次遍历
解题思路:
- 思路上和普通层次遍历没有什么区别,就多了一个偶数层翻转集合顺序
- 深度遍历使用辅助栈结构,层次遍历使用辅助队列结构,java当中List结构也可以作为队列使用
- 通过两个数分别记录当前层和下一层的节点数
- 一个List结构记录每一层的节点,需要翻转时将其反转
- 一个List结构用作辅助队列,起初将root入队
- 利用队列判断循环结束,当队列为空时,结束遍历。
- 内层循环的作用是记录当前层节点
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root==null) {
return new ArrayList<List<Integer>>();
}
//层次遍历二叉树
//翻转标志
boolean resverse = true;
//层次遍历二叉树需要一个队列,
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
//当前层和下一层个数的计数,如果不是输出二重集合结构则不需要
int cur_floor = 1,next_floor = 0;
//返回值集合
List<List<Integer>> result = new ArrayList<List<Integer>>();
//一个临时的存储每层的List集合
ArrayList<Integer> temp = null;
TreeNode node = null;
queue.offer(root);
//当队列不为空的时候进入循环
while(!queue.isEmpty()) {
temp = new ArrayList<Integer>();
while(cur_floor!=0) {
node = queue.poll();
temp.add(node.val);
--cur_floor;
if(node.left!=null) {
queue.offer(node.left);
++next_floor;
}
if(node.right!=null) {
queue.offer(node.right);
++next_floor;
}
}
resverse = !resverse;
if(resverse) {
int len = temp.size();
for(int i = 0;i<len/2;i++) {
int t = temp.get(i);
temp.set(i, temp.get(len-i-1));
temp.set(len-i-1, t);
}
}
result.add(temp);
cur_floor = next_floor;
next_floor = 0;
}
return result;
}