劍指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
/**************************************************************      
* 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);
	}
}


程序運行結果:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章