剑指offer:二叉树打印成多行(层次遍历)
1. 题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2. 思路
层次遍历
3. 递归
public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> list = new ArrayList<>(); depth(pRoot, 1, list); return list; } private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) { if(root == null) return; if(depth > list.size()) list.add(new ArrayList<Integer>()); list.get(depth -1).add(root.val); depth(root.left, depth + 1, list); depth(root.right, depth + 1, list); } }
4. 非递归
import java.util.*; public class Solution { static 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入队 while (!queue.isEmpty()) {// Queue不为空则循环 ArrayList<Integer> node = new ArrayList<>();// 保存每一层节点的值 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); } node.add(tree.val); length--; } // 循环结束后,得到的Queue为下一层做准备,node为本层遍历结果 result.add(node); } return result; } }