/* 日期: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;
}
}