【剑指Offer】把二叉树打印成多行

来源:互联网 发布:05年nba总决赛数据 编辑:程序博客网 时间:2024/04/29 16:09

题目描述

时间限制:1秒 空间限制:32768K

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。


解题思路

前序遍历二叉树,对于每一层经过的结点总是从最左边的开始,然后才逐渐从左到右,其中可能经过不同层的结点,所以每一层做一下标记,不同层的结点添加到不同层的列表中。
例如

ArrayList<ArrayList<Integer>> ans;

那么,第d层的结点从左到右保存在ArrayList<Integer> arr = ans.get(d)中。

代码(Java)

import java.util.ArrayList;import java.util.Collections;class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}public class Main {    public static ArrayList<ArrayList<Integer>> ans;    public static void dfs(TreeNode root, int d) {        //第d层还没有结点,创建存放第d层结点的数组列表        while(ans.size()-1 < d) {            ans.add(new ArrayList<Integer>());        }        //将该节点加入到对应的第d层的数组列表中        ans.get(d).add(root.val);        if(root.left != null)dfs(root.left, d+1);        if(root.right != null)dfs(root.right, d+1);    }    public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {        ans = new ArrayList<ArrayList<Integer>>();        if(pRoot == null) return ans;        ans.add(new ArrayList<Integer>());        dfs(pRoot, 0);        //for(int i = 1; i <= ans.size(); i++) {            //if((i&1) == 0) Collections.reverse(ans.get(i-1));        //}        return ans;    }    /*        测试代码     */    public static void main(String []args){        TreeNode root = new TreeNode(1);        root.left = new TreeNode(2);        root.left.left = new TreeNode(4);        root.left.right = new TreeNode(5);        root.right = new TreeNode(3);        root.right.left = new TreeNode(6);        root.right.right = new TreeNode(7);        ArrayList<ArrayList<Integer>> ans = Print(root);        for(int i = 0; i < ans.size(); i++) {            for(int a : ans.get(i))System.out.print(a+" ");            System.out.println();        }    }}
0 0