请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:在按层打印树的基础上修改,树的奇数层直接添加,偶数层反转后添加
public class shu {
public static void main(String[] args) {
TreeNode tn = new TreeNode(5);
TreeNode tn1 = new TreeNode(4);
TreeNode tn3 = new TreeNode(3);;
TreeNode tn5 = new TreeNode(2);
tn.left = tn1;
tn1.left=tn3;
tn3.left=tn5;
shu s = new shu();
System.out.println(s.Print(tn));
}
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list1 = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> list3 = new ArrayList<>();
int level = 0;
if (pRoot == null) {
return list1;
}
TreeNode p = pRoot;
TreeNode last = pRoot;
Deque<TreeNode> queue = new LinkedList<TreeNode>();
queue.addLast(p);
while (queue.size() != 0) {
p = queue.peekFirst();
System.out.println(p.val);
list2.add(p.val);
queue.removeFirst();
if (p.left != null) {
queue.addLast(p.left);
}
if (p.right != null) {
queue.addLast(p.right);
}
if (p == last) {
level += 1;
if (level % 2 != 0) {
list1.add(list2);
}
if (level % 2 == 0) {
list1.add(reverse(list2));
}
if (queue.size() != 0) {
last = queue.getLast();
list2 = new ArrayList<Integer>(); // 注意这里不是清空list2 !!!!!
}
}
}
System.out.println("层数:" + level);
return list1;
}
private ArrayList reverse(ArrayList<Integer> layerList) {
int length = layerList.size();
ArrayList<Integer> reverseList = new ArrayList<Integer>();
for (int i = length - 1; i >= 0; i--) {
reverseList.add(layerList.get(i));
}
return reverseList;
}
}