问题描述
Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between). Example: 地址
问题分析
代码实现
public List < List < Integer >> zigzagLevelOrder(TreeNode root) {
if (root == null ) {
return new ArrayList<> ();
}
Stack < TreeNode> left2Right = new Stack <> ();
Stack < TreeNode> right2Left = new Stack <> ();
boolean order = true ;
List < List < Integer >> res = new ArrayList<> ();
left2Right. push(root);
while (! left2Right. isEmpty() || ! right2Left. isEmpty()) {
if (order ) {
List < Integer > list = new ArrayList<> ();
while (! left2Right. isEmpty()) {
TreeNode popNode = left2Right. pop();
list . add(popNode. val);
if (popNode. left != null ) {
right2Left. push(popNode. left);
}
if (popNode. right != null ) {
right2Left. push(popNode. right);
}
}
res. add(list );
}else {
List < Integer > list = new ArrayList<> ();
while (! right2Left. isEmpty()) {
TreeNode popNode = right2Left. pop();
list . add(popNode. val);
if (popNode. right != null ) {
left2Right. push(popNode. right);
}
if (popNode. left != null ) {
left2Right. push(popNode. left);
}
}
res. add(list );
}
order = ! order ;
}
return res;
}
public List < List < Integer >> zigzagLevelOrder(TreeNode root) {
if (root == null ) {
return new ArrayList<> ();
}
LinkedList< TreeNode> queue = new LinkedList<> ();
boolean order = true ;
List < List < Integer >> res = new ArrayList<> ();
queue . add(root);
while (! queue . isEmpty()) {
int levelSize = queue . size();
LinkedList< Integer > list = new LinkedList<> ();
for (int i = 0 ; i < levelSize; i++ ) {
TreeNode popNode = queue . remove();
if (order ) {
list . addLast(popNode. val);
}else {
list . addFirst(popNode. val);
}
if (popNode. left != null ) {
queue . add(popNode. left);
}
if (popNode. right != null ) {
queue . add(popNode. right);
}
}
res. add(list );
order = ! order ;
}
return res;
}