main函数测试代码:
按标准输入输出,比如输入:
3,9,20,null,null,15,7
public static void main(String[] args) {//输入3,9,20,null,null,15,7Scanner sc = new Scanner(System.in);String s = sc.nextLine();String[] split = s.split(",");TreeNode root = null;if( split.length!=0){root = new TreeNode(Integer.parseInt(split[0]),null,null);Queue<TreeNode> queue = new LinkedList<>();queue.add(root);for (int i = 1; i < split.length; i++) {TreeNode node = queue.poll();if(!split[i].equals("null")) {//String重写了equals方法,比较的是内容是否相等node.left = new TreeNode(Integer.parseInt(split[i]), null, null);queue.add(node.left);}else {node.left = null;}i++;if(i < split.length && !split[i].equals("null")) {node.right = new TreeNode(Integer.parseInt(split[i]), null, null);queue.add(node.right);}else {node.right = null;}}}//调用函数System.out.println(levelOrderII(root).toString());}
剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
/*** 剑指 Offer 32 - I. 从上到下打印二叉树* 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。*/public static int[] levelOrderI(TreeNode root) {if(root==null){return new int[0];}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);ArrayList<Integer> list = new ArrayList<>();while(!queue.isEmpty()){TreeNode node = queue.remove();list.add(node.val);if(node.left!=null){queue.add(node.left);}if(node.right!=null){queue.add(node.right);}}Integer[] arr = list.toArray(new Integer[list.size()]);int[] res = new int[arr.length];for(int i = 0; i < arr.length; i ++)res[i] = arr[i];return res;}
测试结果:
3,9,20,null,null,15,7
[3, 9, 20, 15, 7]
剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
/*** 剑指 Offer 32 - II. 从上到下打印二叉树 II* 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。*/public static List<List<Integer>> levelOrderII(TreeNode root) {List<List<Integer>> List = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if(root!=null){queue.add(root);}while (!queue.isEmpty()){List<Integer> row = new ArrayList<>();for (int i = queue.size(); i > 0; i--) {TreeNode node = queue.poll();row.add(node.val);if(node.left!=null){queue.add(node.left);}if(node.right!=null){queue.add(node.right);}}List.add(row);}return List;}
测试结果:
3,9,20,null,null,15,7
[[3], [9, 20], [15, 7]]
如果你使用for (int i=0;i<queue.size(); i++) {}
测试结果:
3,9,20,null,null,15,7
[[3, 9], [20, 15], [7]]
明显就是错的,就是因为在程序还没有出for循环之前,queue.size()变大了。
还有一点要特别注意,不能使用
if(root==null){return null;}
这样当输入是[],即root=null的时候,输出是null,实际应该返回的是[]。
剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
思想:层序遍历 + 双端队列(奇偶层逻辑分离)
/*** 剑指 Offer 32 - III. 从上到下打印二叉树 III* 请实现一个函数按照之字形顺序打印二叉树,* 即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。*/public static List<List<Integer>> levelOrderIII(TreeNode root) {List<List<Integer>> List = new ArrayList<>();Deque<TreeNode> deque = new LinkedList<>();int level = 0;if(root != null){deque.addFirst(root);level = 1;}//可以利用链表的头结点和尾结点去理解双端队列的进出关系while (!deque.isEmpty()){List<Integer> row = new ArrayList<>();for (int i = deque.size(); i > 0; i--) {//奇数层if(level%2==1) {TreeNode node = deque.pollLast();row.add(node.val);if (node.left != null) {deque.addFirst(node.left);}if (node.right != null) {deque.addFirst(node.right);}}//偶数层if(level%2==0) {TreeNode node = deque.pollFirst();row.add(node.val);if (node.right != null) {deque.addLast(node.right);}if (node.left != null) {deque.addLast(node.left);}}}List.add(row);level++;}return List;}