Leetcode103. 二叉树的锯齿形层次遍历
题目:
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
题解:
维护两个栈,分别存从左到右和从右到左节点的顺序。
java代码:
/**
* 给定二叉树 [3,9,20,null,null,15,7],
* 返回:
* [
* [3],
* [20,9],
* [15,7]
* ]
*
* @param root
* @return
*/
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) return null;
List<List<Integer>> res = new ArrayList<>();
//存储右节点到左节点的顺序
Stack<TreeNode> stack1 = new Stack<>();
//存储左节点到右节点的顺序
Stack<TreeNode> stack2 = new Stack<>();
stack1.add(root);
while (!stack1.isEmpty() || !stack2.isEmpty()) {
List<Integer> temp = new ArrayList<>();
TreeNode node ;
if (!stack1.isEmpty()) {
while (!stack1.isEmpty()) {
node = stack1.pop();
temp.add(node.value);
if (node.left != null) stack2.push(node.left);
if (node.right != null) stack2.push(node.right);
}
res.add(temp);
} else {
while (!stack2.isEmpty()) {
node = stack2.pop();
temp.add(node.value);
if (node.right != null) stack1.push(node.right);
if (node.left != null) stack1.push(node.left);
}
res.add(temp);
}
}
return res;
}