劍指offer程式碼解析——面試題23從上往下列印二叉樹
阿新 • • 發佈:2022-05-03
本題的詳細分析過程均在程式碼註釋中:
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;//右子樹 }