题目描述
时间限制:1秒 空间限制:32768K
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路
【剑指Offer】把二叉树打印成多行
返回判断一下:
for(int i = 1; i <= ans.size(); i++) {
if((i&1) == 0) Collections.reverse(ans.get(i-1));
}
代码(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();
}
}
}