/* 日期:2019.7.23
* 作者:***
* 功能:劍指offer 題目22
*
* =====================================================
* 問題描述:
* 從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
*
* =====================================================
* 思路詳解:
* 本題目很簡單,學過數據結構關於二叉樹部分的都知道
* 本題目爲
* 樹的廣度優先遍歷,常用思想即爲隊列(先進先出)
*
* */
package com.***********;
import java.util.*;
public class Main2 {
//主函數,作爲程序代碼測試的入口
public static void main(String args[])
{
//模擬題目要求測試用例
TreeNode root = new TreeNode(0);
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
node5.right = node7;
//客戶端代碼
Main2 main2 = new Main2();
ArrayList<Integer> result = main2.PrintFromTopToBottom(root);
//遍歷顯示結果,查看是否正確
System.out.println("程序測試結果顯示如下:");
for(int num : result)
System.out.print(num+" ");
}
//封裝函數,解決問題
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(root == null) return list; //特殊情況處理
Queue<TreeNode> queue = new LinkedList<TreeNode>(); //使用隊列滿足邏輯要求
queue.offer(root); //進入隊列
TreeNode tempNode = null;
while(!queue.isEmpty()) //只要隊列裏還有元素,持續遍歷
{
tempNode = queue.poll(); //取出當前隊列的開頭元素
list.add(tempNode.val); //得到其節點內容
//樹的廣度優先遍歷,左右節點不爲空,添加進入隊列
if(tempNode.left != null) queue.offer(tempNode.left);
if(tempNode.right != null) queue.offer(tempNode.right);
}
return list;
}
}
//==========================
//二叉樹代碼定義如下:
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}