1. 程式人生 > 其它 >劍指offer程式碼解析——面試題23從上往下列印二叉樹

劍指offer程式碼解析——面試題23從上往下列印二叉樹

本題的詳細分析過程均在程式碼註釋中:

import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 題目:從上到下列印二叉樹的結點,同一層的結點按照從左到右的順序列印。
 * @author 大閒人柴毛毛
 * @date 2016年3月15日
 */
public class PrintBinaryTree {
	/**
	 * 分析:學過資料結構便可知,本題實則為寬度優先遍歷二叉樹。
	 * 在資料結構中,深度優先遍歷一棵二叉樹有三種方式:先序遍歷、中序遍歷、後序遍歷。他們均可採用遞迴,程式碼非常簡潔。
	 * 而寬度優先遍歷二叉樹可採用迭代,並藉助一個輔助的佇列來儲存尚未遍歷的結點,下面是詳細過程。
	 */
	
	/**
	 * 首先需要建立一個佇列,用於儲存尚未列印的結點。
	 * 首先讓根結點入隊,然後重複一下操作,直到對為空為止:
	 * 從隊首取出一個結點,並列印該結點,若該結點有孩子,則按照先左後右的順序將左右孩子入隊。
	 * 重複上述操作,當隊為空時,遍歷結束。
	 */
	
	public static boolean printBinaryTree(BinaryTreeNode<Integer> root){
		//若樹為空
		if(root==null){
			System.out.println("樹為空!");
			return false;
		}
		
		//建立佇列
		Queue<BinaryTreeNode<Integer>> queue = new LinkedBlockingQueue<BinaryTreeNode<Integer>>();
		//將根結點入隊
		queue.add(root);
		//當隊不為空時
		while(!queue.isEmpty()){
			//取出隊首結點
			BinaryTreeNode<Integer> first_node = queue.poll();
			System.out.println(first_node.data);
			//若該結點有孩子,則按照先左後右的順序將孩子入隊
			if(first_node.left!=null)
				queue.add(first_node.left);
			if(first_node.right!=null)
				queue.add(first_node.right);
		}
		return true;
	}
	
	
	
	/**
	 * 測試
	 */
	public static void main(String[] args){
		//構建二叉樹
		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>();
		BinaryTreeNode<Integer> node1 = new BinaryTreeNode<Integer>();
		BinaryTreeNode<Integer> node2 = new BinaryTreeNode<Integer>();
		BinaryTreeNode<Integer> node3 = new BinaryTreeNode<Integer>();
		BinaryTreeNode<Integer> node4 = new BinaryTreeNode<Integer>();
		BinaryTreeNode<Integer> node5 = new BinaryTreeNode<Integer>();
		
		root.data = 1;
		node1.data = 2;
		node2.data = 3;
		node3.data = 4;
		node4.data = 5;
		node5.data = 6;
		
		root.left = node1;
		root.right = node2;
		
		node1.left = node3;
		node1.right = node4;

		node2.right = node5;
		
		printBinaryTree(root);
	}
}




/**
 * 二叉樹的結點
 */
class BinaryTreeNode<T>{
	T data;//結點的資料域
	BinaryTreeNode<T> left;//左子樹
	BinaryTreeNode<T> right;//右子樹
}