剑指Offer——题目22

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

 

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