【LeetCode】103# 二叉树的锯齿形层次遍历

时间:2023-03-09 06:30:32
【LeetCode】103# 二叉树的锯齿形层次遍历

题目描述

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:

给定二叉树 [3,9,20,null,null,15,7],

    3
/ \
9 20
/ \
15 7

返回锯齿形层次遍历如下:

[
[3],
[20,9],
[15,7]
]

解题思路

考虑到题目需要用折线得方式遍历,就是说在遍历的过程中需要有反向操作,可以联想到使用栈来实现。

双栈法

  1. 建立两个栈stack1stack2
  2. 把二叉树的根节点pushstack1
  3. 使用一个while循环,pop当前节点的子结点,然后push进另一个栈,这样每处理一个栈,就在最终结果ans里面加一个列表(当前深度的节点)

源代码

public List<List<Integer>> zigzagLevelOrder (TreeNode root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if (root== null) return ans;
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
TreeNode cur = root;
stack1.push(cur);
while (!stack1.isEmpty() || !stack2.isEmpty()) {
List<Integer> temp = new ArrayList<>();
while (!stack1.isEmpty()) {
cur = stack1.pop();
temp.add(cur.val);
if (cur.left !=null) stack2.push(cur.left);
if (cur.right !=null) stack2.push(cur.right);
}
ans.add(temp);
temp = new ArrayList<>();
while (!stack2.isEmpty()) {
cur = stack2.pop();
temp.add(cur.val);
if (cur.right !=null) stack1.push(cur.right);
if (cur.left !=null) stack1.push(cur.left);
}
if (!temp.isEmpty()) {
ans.add(temp);
}
}
return ans;
}

心得体会

一开始只用了一个栈和一个列表来实现,怎么也调不通,后来参考了讨论区的解答,使用双栈,豁然开朗。