思路:就是层次遍历的变种题目,在层次遍历的基础之上加一个层数的奇偶判断即可!
先来分享一下层次遍历的模板,大家可以多看看,多加练习!
//层次遍历 void levelOrder(Btree T){ InitQueue(Q);//初始化队列 Btree p; EnQueue(Q, T);//根节点入队 while(!IsEmpty(Q)){ DeQueue(Q, p);//节点出队 visit(p); if(p->lchild != null){//节点左子树不为空,则入队 EnQueue(Q, p->lchild); } if(p->rchild != null){//节点右子树不为空,则入队 EnQueue(Q, p->rchild); } } }
层次遍历代码(JZ60):
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * @param root TreeNode类 * @return int整型ArrayList<ArrayList<>> */ ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();//保存结果 public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) { // write code here if(root==null){ //如果为空,直接返回 return result; } Queue<TreeNode> queue = new LinkedList<>();//对列,先进先出 queue.offer(root);//根节点入队 while(!queue.isEmpty()){ ArrayList<Integer> result1 = new ArrayList<>();//存当前层 int nowlen = queue.size();//队伍中的节点个数 for(int i = 0;i<nowlen;i++){ TreeNode nowroot = queue.poll();//获取队首 result1.add(nowroot.val);//把当前节点的值插入到result1中 if(nowroot.left != null){ queue.offer(nowroot.left); } if(nowroot.right != null){ queue.offer(nowroot.right); } } result.add(result1);//说明当前层结束,将该层结果加入到result中! } return result; } }
对于本题而言,我们只需要在最后加入result结果中前加一个判断,使用count变量来记录层数,从第一层开始。代码如下:
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * @param root TreeNode类 * @return int整型ArrayList<ArrayList<>> */ ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();//最终结果 public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) { // write code here // write code here if(root == null){ return result; } Queue<TreeNode> queue = new LinkedList<>();//Queue是接口,实现类有LinkedList queue.offer(root);//根节点入队 int count = 1;//记录奇偶层 起始为1 while(!queue.isEmpty()){ ArrayList<Integer> result1 = new ArrayList<>();//存当前层 int nowlen = queue.size();//队伍中当前层的节点个数 for(int i = 0;i<nowlen;i++){ TreeNode nowroot = queue.poll();//获取队首 result1.add(nowroot.val);//把当前节点的值插入到result1中 if(nowroot.left != null){ queue.offer(nowroot.left); } if(nowroot.right != null){ queue.offer(nowroot.right); } } //遍历完当前层后,将结果放入result中 if(count%2 == 1){ //奇数层 result.add(result1); count++; }else{ Collections.reverse(result1);//反转 result.add(result1); count++; } } return result; } }