2025年--Lc166--H103.二叉树的锯齿形层序遍历(二叉树的层序遍历)--Java版
1.题目
2.思路
res.size():当前已经完成并加入结果的层数。从 0 开始计层,所以
res.size() % 2 == 0 表示正在处理的这一层是偶数层(第 0、2、4…层),方向为从左到右;
否则是奇数层(第 1、3、5…层),方向为从右到左。
tmp 是这一层的临时链表(LinkedList),用它是因为可以头插/尾插:
偶数层:addLast 把节点值放到尾部,自然形成左→右;(倒序)
奇数层:addFirst 把节点值放到头部,等效把本层顺序反过来(右→左)。(顺序)
3.代码实现
/*** 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;}Queue<TreeNode> que=new LinkedList<TreeNode>();//根节点先入队que.offer(root);while(!que.isEmpty()){LinkedList<Integer> tmp=new LinkedList<>();//局部变量:size是根据当前层的节点个数变化的int size=que.size();for(int i=size;i>0;i--){//从队列中弹出元素TreeNode node=que.poll();// 若为偶数层,将 node.val 添加至 tmp 尾部;否则,添加至 tmp 头部。// 比如9和20,因为是偶数个节点个数,所以 9《-20//结果是(20,9)if(res.size()%2==0)tmp.addLast(node.val);//15和7,所以是15-》7,结果(15,7)elsetmp.addFirst(node.val);//遍历该节点的左右孩子TreeNode left=node.left;TreeNode right=node.right;if(left!=null){//如果左孩子节点不为空,入队que.offer(left);}if(right!=null){que.offer(right);}}//将当前层结果 tmp 转化为 list 并添加入 resres.add(tmp);}//打印结果列表 resreturn res;}
}