1. 程式人生 > >劍指Offer面試題61:按之子型列印二叉樹 Java實現

劍指Offer面試題61:按之子型列印二叉樹 Java實現

/**************************************************************      
* 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);
	}
}
程式執行結果: