题目描述
时间限制: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();
}
}
}