剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)
1. 题目描述
/** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推。 */
2. 双向队列
/*思路:利用Java中的LinkedList的底层实现是双向链表的特点。 1)可用做队列,实现树的层次遍历 2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历 */
3. 代码(双向链表+层次遍历)
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { return levelorder(pRoot); } public static ArrayList<ArrayList<Integer>> levelorder(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if(root == null) return result; queue.offer(root); // 首先将根节点root入队 int level = 0;//记录层数 while (!queue.isEmpty()) {// Queue不为空则循环 LinkedList<Integer> node = new LinkedList<>();// 保存每一层节点的值 int length = queue.size();// 每一层的节点数目 while (length > 0) { TreeNode tree = queue.poll(); if (tree.left != null) { queue.offer(tree.left); } if (tree.right != null) { queue.offer(tree.right); } if((level+1)%2==0){ node.addFirst(tree.val); }else{ node.add(tree.val); } length--; } // node为本层遍历结果 // 将linkedlist转成 ArrayList ArrayList<Integer> arrayNode = new ArrayList<>(); for (Integer i: node) { arrayNode.add(i); } result.add(arrayNode); //循环结束后,得到的Queue为下一层做准备, level++; } return result; } }