描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 100∣val∣<=100
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是 [[1],[3,2],[4,5]]
思路:
如果当前层是从左往右的顺序访问,那么下一层入栈和当前层的访问方式一致!!!
结合图片和以下代码会更容易理解些。
代码实现:
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > result = new ArrayList<>();
if(pRoot == null){
return result;
}
Stack<TreeNode> st = new Stack<>();//栈为主
Queue<TreeNode> q = new LinkedList<>();//队为辅
ArrayList<Integer> list = new ArrayList<>();
int dir = 1;//1:代表从左向右入栈 2:代表从右往左入栈
st.push(pRoot);
while(!st.isEmpty()){
int size = st.size();
for(int i = 0; i < size; i++){
TreeNode cur = st.pop();
list.add(cur.val);
//之字形打印逻辑
TreeNode first = (dir == 1)?cur.left:cur.right;
TreeNode second = (dir == 1)?cur.right:cur.left;
//层序遍历逻辑
if(first != null){
q.offer(first);
}
if(second != null){
q.offer(second);
}
}
//本层遍历完入结果集
result.add(new ArrayList(list));//注意深浅拷贝问题
list.clear();
//将队列中的结点入栈
while(!q.isEmpty()){
st.push(q.poll());
}
dir = (dir ==1)?2:1;//调整入栈的顺序
}
return result;
}
}