劍指Offer面試題61:按之子型列印二叉樹 Java實現
阿新 • • 發佈:2019-02-19
程式執行結果:/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0 * 題目描述:按之字型列印二叉樹 * 請實現一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,即第一行按照從左到右的順序列印,第二層按照從右到左順序列印,第三行再按照從左到右的順序列印,其他以此類推。例如,按之字型列印下圖的二叉樹結果為: * 1 * 3 2 * 4 5 6 7 * 15 14 13 12 11 10 9 8 * 輸入描述:無 * 程式輸出:按之字型列印的二叉樹為: * 1 * 3 2 * 4 5 6 7 * 9 8 * 問題分析: 無 * 演算法描述:按之字形順序列印二叉樹需要兩個棧。我們在列印某一行結點時,把下一層的子結點儲存到相應的棧裡。 * 如果當前列印的是奇數層,則先儲存左子結點再儲存右子結點到一個棧裡;如果當前列印的是偶數層,則先儲存右子結點再儲存左子結點到第二個棧裡。 * 完成日期:2016-10-16 ***************************************************************/ package org.marsguo.offerproject61; import java.util.LinkedList; import java.util.List; class TreeNode{ int val; TreeNode left = null; TreeNode right = null; public TreeNode(int val){ this.val = val; } public String toString(){ return + val + ""; } } class SolutionMethod1{ public void PrintFunction(TreeNode root){ if(root == null) return ; List<TreeNode> list1 = new LinkedList<>(); List<TreeNode> list2 = new LinkedList<>(); TreeNode node; int line = 0; list1.add(root); //把根節點放入root中 while(list1.size() > 0 ){ node = list1.remove(list1.size() - 1); System.out.printf("%-3d",node.val); if(line == 0){ if(node.left != null){ list2.add(node.left); } if(node.right != null){ list2.add(node.right); } } else{ if(node.right != null){ list2.add(node.right); } if(node.left != null){ list2.add(node.left); } } if(list1.size() == 0){ line = 1-line; List<TreeNode> tmp = list1; list1 = list2; //node每次列印都是list1,所以需要調換list1和list2並分別輸出 list2 = tmp; System.out.println(); } } } } public class PrintZBinaryTree { public static void main(String[] args){ SolutionMethod1 solution1 = new SolutionMethod1(); TreeNode n1 = new TreeNode(1); TreeNode n2 = new TreeNode(2); TreeNode n3 = new TreeNode(3); TreeNode n4 = new TreeNode(4); TreeNode n5 = new TreeNode(5); TreeNode n6 = new TreeNode(6); TreeNode n7 = new TreeNode(7); TreeNode n8 = new TreeNode(8); TreeNode n9 = new TreeNode(9); n1.left = n2; n1.right = n3; n2.left = n4; n2.right = n5; n3.left = n6; n3.right = n7; n4.left = n8; n4.right = n9; System.out.println("按之字型列印的二叉樹為:"); solution1.PrintFunction(n1); } }