问题
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
算法
在层序遍历的基础上进行改进
分析
代码
package ATree;
import java.util.*;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/3/13 0013 17:54
* 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
* 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
*/
public class Problem4 {
//层序遍历
public void level(TreeNode pRoot){
Queue<TreeNode> queue = new ArrayDeque<>();
//先实现层序遍历
TreeNode temp = pRoot;
queue.add(temp);
while(queue.size()!=0){
temp = queue.poll();
if(temp.left!=null){
queue.add(temp.left);
}
if(temp.right!=null){
queue.add(temp.right);
}
System.out.println(temp.val);
}
}
//Z子姓打印
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
//true表示奇数层,false表示偶数层
boolean flag = true;
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(pRoot);
while(queue.size()!=0){
//计算此时队列的长度以此计算需要取出的数据个数
int len = queue.size();
ArrayList<Integer> arrayList =new ArrayList<>();
TreeNode treeNode = null;
for(int i=0;i<len;i++){
treeNode = queue.poll();
if(treeNode.left!=null){
queue.add(treeNode.left);
}
if(treeNode.right!=null){
queue.add(treeNode.right);
}
arrayList.add(treeNode.val);
}
if(!flag){//反序取数据
Collections.reverse(arrayList);
}
//更换奇偶层标志
flag = !flag;
result.add(arrayList);
}
return result;
}
public static void main(String[] args) {
TreeNode A = new TreeNode(1);
TreeNode B = new TreeNode(2);
TreeNode C = new TreeNode(3);
TreeNode D = new TreeNode(4);
TreeNode E = new TreeNode(5);
TreeNode G = new TreeNode(6);
TreeNode H = new TreeNode(7);
TreeNode I = new TreeNode(8);
A.left=B;
A.right=C;
B.left=D;
C.left=E;
C.right=G;
D.right=H;
G.left=I;
Problem4 problem4 = new Problem4();
// problem4.Print(A);
ArrayList<ArrayList<Integer>> result = problem4.Print(A);
for(ArrayList<Integer> t:result){
for(Integer re:t){
System.out.print(re+" ");
}
System.out.println(" ");
}
}
}