/**************************************************************
* 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);
}
}
劍指Offer面試題61:按之子型打印二叉樹 Java實現
題目:按之字型打印二叉樹
程序運行結果:
請實現一個函數按照之字形順序打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右到左的順序打印,即第一行按照從左到右的順序打印,第二層按照從右到左順序打印,第三行再按照從左到右的順序打印,其他以此類推。例如,按之字型打印下圖的二叉樹結果爲:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
算法分析:
按之字形順序打印二叉樹需要兩個棧。我們在打印某一行結點時,把下一層的子結點保存到相應的棧裏。如果當前打印的是奇數層,則先保存左子結點再保存右子結點到一個棧裏;如果當前打印的是偶數層,則先保存右子結點再保存左子結點到第二個棧裏。
算法源程序
以下程序轉自博客:http://blog.csdn.net/derrantcm/article/details/46857935
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.