題目
給你一個二叉樹,請你傳回其按 層序周遊 得到的節點值。 (即逐層地,從左到右通路所有節點)。
示例:
二叉樹:[3,9,20,null,null,15,7]

傳回其層次周遊結果:
注意點
參考1:二叉樹的層序周遊(BFS實作)
參考2:二叉樹的層次周遊Ⅱ(BFS實作)
1、該題是以上兩道題的綜合,根據不同情況采取不同的操作;
- 向左周遊,使用尾插法;
- 向右周遊,使用頭插法。
實作
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
// 是否向左周遊(反向),預設為向右周遊
boolean orderLeft = false;
if (root == null) {
return result;
}
// 隊列用于存放每一層的節點
Queue<TreeNode> queue = new ArrayDeque<>();
// 第一層隻有根節點
queue.add(root);
//周遊二叉樹
while (!queue.isEmpty()) {
// 每一層的結果
LinkedList<Integer> level = new LinkedList<>();
// 每一層節點數
int queueSize = queue.size();
//周遊每一層
for (int i = 0; i < queueSize; i ++) {
// 目前節點
TreeNode curNode = queue.poll();
// 目前節點值
int curNodeVal = curNode.val;
//判斷周遊方向
if (orderLeft) {
// 向左周遊,使用尾插法
level.addFirst(curNodeVal);
} else {
// 向右周遊,使用頭插法
level.addLast(curNodeVal);
}
// 判斷是否存在左節點
if (curNode.left != null) {
queue.add(curNode.left);
}
// 判斷是否存在右節點
if (curNode.right != null) {
queue.add(curNode.right);
}
}
result.add(level);
// 反向
orderLeft = !orderLeft;
}
return result;
}