按之字形順序打印二叉樹Java實現


題目描述

請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。

分析

用一個布爾量控制從左到右還是從右到左的順序;如果為真則他的左右孩子按照從左到右的順序放入list中,否則按照從右到左的順序,當本行結束之后,再把list中的數據放入一個result中。其中用一個null值作為層次的分隔符。

代碼

 

 1 package com.leetcode.printTreeNode;  2 
 3 import java.util.ArrayList;  4 import java.util.Iterator;  5 import java.util.LinkedList;  6 
 7 /**
 8  * Created by Feng on 2016/11/8.  9  * 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印, 10  * 第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 11  */
12 public class PrintTreeNode { 13     public static void main(String[] args) { 14         TreeNode node1 = new TreeNode(1); 15         TreeNode node2 = new TreeNode(2); 16         TreeNode node3 = new TreeNode(3); 17         TreeNode node4 = new TreeNode(4); 18         TreeNode node5 = new TreeNode(5); 19         TreeNode node6 = new TreeNode(6); 20         TreeNode node7 = new TreeNode(7); 21         TreeNode node8 = new TreeNode(8); 22         TreeNode node9 = new TreeNode(9); 23         node1.left = node2; 24         node1.right = node3; 25         node2.left = node4; 26         node2.right = node5; 27         node3.left = node6; 28         node3.right = node7; 29         node4.left = node8; 30         node4.right = node9; 31         ArrayList<ArrayList<Integer>> result = printTreeNode(node1); 32         for (ArrayList list : result) { 33             for (int i = 0; i < list.size(); i++) { 34                 System.out.print(list.get(i) + " "); 35  } 36  } 37  } 38 
39     public static ArrayList<ArrayList<Integer>> printTreeNode(TreeNode pRoot) { 40 
41         ArrayList<ArrayList<Integer>> result = new ArrayList<>(); 42         if (pRoot == null) { 43             return result; 44  } 45 
46         ArrayList<Integer> list = new ArrayList<>(); 47         LinkedList<TreeNode> queue = new LinkedList<>(); 48         queue.addLast(null);//層分隔符
49  queue.addLast(pRoot); 50         boolean leftToRight = true; 51         while (queue.size() != 1) { 52             TreeNode node = queue.removeFirst(); 53             if (node == null) {//到達層分隔符
54                 Iterator<TreeNode> iter = null; 55                 if (leftToRight) { 56                     iter = queue.iterator();//從前往后遍歷
57                 } else { 58                     iter = queue.descendingIterator();//從后往前遍歷
59  } 60                 leftToRight = !leftToRight; 61                 while (iter.hasNext()) { 62                     TreeNode temp = (TreeNode) iter.next(); 63  list.add(temp.val); 64  } 65                 result.add(new ArrayList<Integer>(list)); 66  list.clear(); 67                 queue.addLast(null);//添加層分隔符
68                 continue;//一定要continue
69  } 70             if (node.left != null) { 71  queue.addLast(node.left); 72  } 73             if (node.right != null) { 74  queue.addLast(node.right); 75  } 76  } 77 
78         return result; 79  } 80 
81 } 82 
83 class TreeNode { 84     int val = 0; 85     TreeNode left = null; 86     TreeNode right = null; 87 
88     public TreeNode(int val) { 89         this.val = val; 90  } 91 }

運行結果

 

1 3 2 4 5 6 7 9 8 Process finished with exit code 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM