劍指Offer面試題60:把二叉樹打印成多行 Java實現

題目:把二叉樹打印成多行
          從上到下按層打印二叉樹,同一行的節點從左到右的順序打印,每一層打印到新的一行。例如,打印下圖的二叉樹結果爲:
8,
6 10
5  7  9  11

算法分析:
爲了把二叉樹的每一行單獨打印到一行裏,我們需要兩個變量:一個變量表示在當前層還沒有打印的節點數,另一個變量表示下一層的節點數目。
用一個隊列來保存將要打印的結點。爲了把二叉樹的每一行單獨打印到一行裏,我們需要兩個變量:一個變量表示在當前的層中還沒有打印的結點數,另一個變量表示下一次結點的數目。

算法源程序:
以下算法轉自博客:http://blog.csdn.net/derrantcm/article/details/46857911

/**************************************************************      
* Copyright (c) 2016, 
* All rights reserved.                   
* 版 本 號:v1.0                   
* 題目描述:把二叉樹打印成多行
*   	        從上到下按層打印二叉樹,同一行的節點從左到右的順序打印,每一層打印到新的一行。例如,打印下圖的二叉樹結果爲:
*			8,
*			6 10
*			5  7  9  11
* 輸入描述:無
* 程序輸出:按層打印的二叉樹爲:
*			1  
*			2  3  
*			4  5  6  7  
*			8  9  
*
* 問題分析: 無
* 算法描述:爲了把二叉樹的每一行單獨打印到一行裏,我們需要兩個變量:一個變量表示在當前層還沒有打印的節點數,另一個變量表示下一層的節點數目。
*			用一個隊列來保存將要打印的結點。爲了把二叉樹的每一行單獨打印到一行裏,
*			我們需要兩個變量:一個變量表示在當前的層中還沒有打印的結點數,另一個變量表示下一次結點的數目。
* 完成日期:2016-10-16
***************************************************************/

package org.marsguo.offerproject60;

import java.util.*;


class TreeNode{
	int val;
	public TreeNode left = null;
	public TreeNode right = null;
	public TreeNode(){
		
	}
	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> list = new LinkedList<>();
		TreeNode node;
		int current = 1;				//當前層節點個數
		int next = 0;					//記錄的下一層節點個數
		list.add(root);					//把根節點放入root中
		
		while(list.size() > 0){
			node = list.remove(0);		//從list中取出根節點,並打印輸出
			current--;
			System.out.printf("%-3d",node.val);
			
			if(node.left != null){
				list.add(node.left);
				next++;
			}
			
			if(node.right != null){
				list.add(node.right);
				next++;
			}
			/*
			*	當前層打印完畢,則將下一層的節點賦給current
			*/
			if(current == 0){			
				System.out.println();
				current = next;
				next = 0;
			}
		}
	}
}

public class PrintBinaryTree {
	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);
	}
}


程序運行結果:



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