剑指 Offer 32 . 从上到下打印二叉树
题目:
【1】第一种
【2】第二种
思路:
【1】第一种,说白了就是正常的二叉树的层次遍历,顺序为从上到下,从左到右,这种一般是借助于队列或者其他数据结构完成。
【2】第二种,算是第一种的变种,在层次遍历的基础上加上返回的数据层次,而且还要对偶数层进行数据的反转。
【3】其次吧,这个题应该可以归到简单类型中。
代码展示:
//剑指 Offer 32 . 从上到下打印二叉树 public class Offer { //思路一:说白了就是层次遍历然后统一塞到一个数组里面,顺序为从上到下,从左到右 public static int[] Method1(TreeNode root){ if(root == null){ return new int[0]; } //层次遍历少不了要借助队列 Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); ArrayList<Integer> ans = new ArrayList<>(); while(!queue.isEmpty()) { TreeNode node = queue.poll(); ans.add(node.val); if(node.left != null){ queue.add(node.left); } if(node.right != null){ queue.add(node.right); } } // 之所以转一遍是因为ArrayList存储的是对象,所以将Integer对象类型要转回为int用于返回 int[] res = new int[ans.size()]; for(int i = 0; i < ans.size(); i++){ res[i] = ans.get(i); } return res; } //思路一:说白了就是层次遍历,然后返回也是要分层次的 //但是存在一个坑就是,遇到偶数层是从右到左 public static List<List<Integer>> Method2(TreeNode root){ if(root==null) { return new ArrayList<>(); } //层次遍历少不了要借助队列 Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); List<List<Integer>> res = new ArrayList<>(); int level = 1; while(!queue.isEmpty()) { int size = queue.size(); LinkedList<Integer> item = new LinkedList<>(); for (int i=0;i<size;i++){ TreeNode node = queue.poll(); item.add(node.val); if(node.left != null){ queue.add(node.left); } if(node.right != null){ queue.add(node.right); } } if (level%2 ==1){ res.add(item); }else { LinkedList<Integer> temp = new LinkedList<>(); for (int i = item.size()-1 ; i>=0 ;i-- ){ temp.add(item.get(i)); } res.add(temp); } level++; } return res; } class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }