廊坊做网站的哪最多/seo手机端优化
按之字形顺序打印二叉树
- 题目描述
- 思路
- 实现
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
设置标志变量flag:奇数层flag=false,偶数层flag=true
用队列存放每一层结点,每遍历完一层,就将flag取反
遍历完一层,利用flag判断是否需要将该层结点反序(偶数层需要反序)
实现
import java.util.*;
/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}
*/
public class Solution {public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> res =new ArrayList<ArrayList<Integer>>();Queue<TreeNode> q=new LinkedList<>();if(pRoot==null) return res;//奇数层flag=false,偶数层flag=trueboolean flag=true;//先把根加入队列q.offer(pRoot);while(!q.isEmpty()){flag=!flag; //每遍历完一层,就将flag取反(第一次循环,第一层是根,flag为false)int size=q.size(); //size记录队列大小,即每层结点个数ArrayList<Integer> list=new ArrayList<>(); //list存放每一层的结点值//遍历每层结点for(int i=0;i<size;i++){ //这里的size不可以直接写q.size(),必须使程序再回到外层循环判断,不可只执行内部for循环TreeNode cur=q.remove();list.add(cur.val);if(cur.left!=null){q.offer(cur.left);}if(cur.right!=null){q.offer(cur.right);}}//遍历完一层后,根据flag判断是奇数层还是偶数层,决定是否需要反转if(flag){Collections.reverse(list);}res.add(list);}return res;}
}
其他打印二叉树的文章:
按层打印(不分行):从上往下打印二叉树
按层打印(分行):把二叉树打印成多行