103. 二叉树的锯齿形层次遍历 #
Difficulty: 中等
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
题解 #
题解一:BFS(广度优先遍历) #
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
Deque<TreeNode> queue = new LinkedList<>();
queue.addLast(root);
queue.addLast(null);
LinkedList<Integer> levelList = new LinkedList<>();
boolean isOrderLeft = true;
while (queue.size() > 0) {
TreeNode currentNode = queue.pollFirst();
if (currentNode != null) {
if (isOrderLeft) {
levelList.addLast(currentNode.val);
} else {
levelList.addFirst(currentNode.val);
}
if (currentNode.left != null) {
queue.addLast(currentNode.left);
}
if (currentNode.right != null) {
queue.addLast(currentNode.right);
}
} else {
result.add(levelList);
levelList = new LinkedList<>();
if (queue.size() > 0) {
queue.addLast(null);
}
isOrderLeft = !isOrderLeft;
}
}
return result;
}
}
复杂度分析 #
-
时间复杂度:O(N),其中 N 是树中节点的数量。
-
空间复杂度:O(N),其中 N 是树中节点的数量。
解法二:DFS (深度优先遍历) #
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
protected void DFS(TreeNode node, int level, List<List<Integer>> results) {
if (level >= results.size()) {
LinkedList<Integer> newLevel = new LinkedList<Integer>();
newLevel.add(node.val);
results.add(newLevel);
} else {
if (level % 2 == 0)
results.get(level).add(node.val);
else
results.get(level).add(0, node.val);
}
if (node.left != null) DFS(node.left, level + 1, results);
if (node.right != null) DFS(node.right, level + 1, results);
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<List<Integer>>();
}
List<List<Integer>> results = new ArrayList<List<Integer>>();
DFS(root, 0, results);
return results;
}
}
复杂度分析 #
-
时间复杂度:O(N),其中 N 是树中节点的数量。
-
空间复杂度:O(H),其中 H 是树的高度。