码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指Offer】60、按之字形顺序打印二叉树

时间:2020-02-24 12:47:15      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:位置   返回   lin   continue   otn   区别   核心   data   plain   

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

题解:BFS
  1. 主要的方法与BFS写法没什么区别

  2. 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]]

 

【剑指Offer】60、按之字形顺序打印二叉树

标签:位置   返回   lin   continue   otn   区别   核心   data   plain   

原文地址:https://www.cnblogs.com/Blog-cpc/p/12356164.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!