0103.二叉树的锯齿形层次遍历
描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
题解
- 两个
stack
用于存储奇数层和偶数层的节点 - 奇数层遍历时,先入
left
再入right
- 偶数层遍历时,先入
right
再入left
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
boolean isLeftToRight = true;
List<List<Integer>> result = new LinkedList<>();
if (root == null)
return result;
Stack<TreeNode> stack1 = new Stack<>();//left2right
Stack<TreeNode> stack2 = new Stack<>();//right2left
stack1.push(root);
while (true){
List<Integer> list = new LinkedList<>();
stack2.clear();
while (!stack1.empty()){
TreeNode node = stack1.pop();
list.add(node.val);
if (node.left != null)
stack2.push(node.left);
if (node.right != null)
stack2.push(node.right);
}
result.add(list);
if (stack2.empty())
break;
list = new LinkedList<>();
stack1.clear();
while (!stack2.empty()){
TreeNode node = stack2.pop();
list.add(node.val);
if (node.right != null)
stack1.push(node.right);
if (node.left != null)
stack1.push(node.left);
}
result.add(list);
if (stack1.empty())
break;
}
return result;
}