# ⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)

305 篇文章 6 订阅
7 篇文章 0 订阅

### 103. 二叉树的锯齿形层序遍历

示例 1：

-100 <= Node.val <= 100


### 方法一：按层模拟BFS

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {

public void reverse(List<Integer> list){
int size = list.size();
int tmp[] = new int[size];
for(int i=0;i<size;i++){
tmp[i] = list.get(i);
}
int index = 0;
for(int i=size-1;i>=0;i--){
list.set(index,tmp[i]);
index++;
}
}

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null){
return res;
}
boolean flag = true; // true代表->   false代表<-
List<Integer> first = new ArrayList<>();
if(root.left != null)
queue.offer(root.left);
if(root.right != null)
queue.offer(root.right);

while(!queue.isEmpty()){
List<Integer> tmp = new ArrayList<>();
int count = queue.size();
while(count > 0){
TreeNode node = queue.poll();
if(node.left != null)
queue.offer(node.left);
if(node.right != null)
queue.offer(node.right);
count--;
}
flag = !flag;
if(!flag){
//对此时取到的tmp顺序取反
reverse(tmp);
}

}

return res;
}
}


### 方法二：双端队列+奇偶

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null){
return res;
}
int len = 1;// 奇数代表->   偶数代表<-
if(root.left != null)
queue.offer(root.left);
if(root.right != null)
queue.offer(root.right);
len++;

while(!queue.isEmpty()){
// 队列依旧是传统队列，但是每一个加入到res中的小list都是用双端形式，从而形式上实现双端队列
// 也是因为链表形式相较于数组形式更利于反转
int count = queue.size();
while(count > 0){
TreeNode node = queue.poll();
if(node.left != null)
if(node.right != null)
queue.offer(node.right);
if(len % 2 == 0){
}
else{
}
count--;
}
len++;
}

return res;
}
}


• 1
点赞
• 0
收藏
觉得还不错? 一键收藏
• 打赏
• 0
评论
11-17
02-24 596
04-12 435
04-14 714
04-15 376
04-15 487
04-13 318
04-14 301
04-16 372

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。