标签:位置 返回 lin continue otn 区别 核心 data plain
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
主要的方法与BFS写法没什么区别
BFS里是每次只取一个,而我们这里先得到队列长度size,这个size就是这一层的节点个数,然后通过for循环去poll出这size个节点,这里和按行取值二叉树返回ArrayList<ArrayList<Integer>>这种题型的解法一样,之字形取值的核心思路就是通过两个方法:
list.add(T): 按照索引顺序从小到大依次添加
list.add(index, T): 将元素插入index位置,index索引后的元素依次后移,这就完成了每一行元素的倒序,或者使用Collection.reverse()方法倒序也可以
1 public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { 2 ArrayList<ArrayList<Integer>> res = new ArrayList<>(); 3 LinkedList<TreeNode> queue = new LinkedList<>(); 4 if(pRoot==null){ 5 return res; 6 } 7 //正序反序输出控制 8 boolean flag=true; 9 queue.offer(pRoot); 10 while (queue.size()!=0){ 11 int size=queue.size(); 12 ArrayList<Integer> list = new ArrayList<>(); 13 for(int i=0;i<size;i++){ 14 TreeNode treeNode = queue.poll(); 15 if(treeNode==null){ 16 continue; 17 } 18 if(flag){ 19 list.add(treeNode.val); 20 }else { 21 list.add(0,treeNode.val); 22 } 23 queue.offer(treeNode.left); 24 queue.offer(treeNode.right); 25 } 26 if(list.size()!=0){ 27 res.add(list); 28 } 29 flag=!flag; 30 } 31 return res; 32 }
初始化树:
1 public static class TreeNode { 2 int val = 0; 3 TreeNode left = null; 4 TreeNode right = null; 5 public TreeNode(int val) { 6 this.val = val; 7 } 8 } 9 private static List<TreeNode> nodeList = null; 10 public static TreeNode createBinTree(int[] array) { 11 nodeList=new LinkedList<TreeNode>(); 12 // 将一个数组的值依次转换为TreeNode节点 13 for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) { 14 nodeList.add(new TreeNode(array[nodeIndex])); 15 } 16 // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树 17 for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) { 18 // 左孩子 19 nodeList.get(parentIndex).left = nodeList 20 .get(parentIndex * 2 + 1); 21 // 右孩子 22 nodeList.get(parentIndex).right = nodeList 23 .get(parentIndex * 2 + 2); 24 } 25 // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理 26 int lastParentIndex = array.length / 2 - 1; 27 // 左孩子 28 nodeList.get(lastParentIndex).left = nodeList 29 .get(lastParentIndex * 2 + 1); 30 // 右孩子,如果数组的长度为奇数才建立右孩子 31 if (array.length % 2 == 1) { 32 nodeList.get(lastParentIndex).right = nodeList 33 .get(lastParentIndex * 2 + 2); 34 } 35 return nodeList.get(0); 36 }
测试:
1 public static void main(String[] args) { 2 int[] tree={8,6,10,5,7,9,11}; 3 TreeNode rootNode = createBinTree(tree); 4 ArrayList<ArrayList<Integer>> lists = Print(rootNode); 5 System.out.println(lists); 6 } 7 输出:[[8],[10,6],[5,7,9,11]]
标签:位置 返回 lin continue otn 区别 核心 data plain
原文地址:https://www.cnblogs.com/Blog-cpc/p/12356164.html