一,问题描述:
1,给定一棵二叉树,返回它的层次遍历。
2,例如:
3,解题思路:
使用LinkedList queue=new LinkedList()。因为LinkedList具有队列的性质,即先进先出规则。然后统计每一层的节点个数,然后在每层从左到右输出节点。
二,AC了的程序(使用Java实现的)
import java.util.*;
class TreeNode{ //节点的构造
int val;
TreeNode left;
TreeNode right;
TreeNode(int x)
{
val=x;
}
}
public class Test2{
List<List<Integer>> list=new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root)
{
if(root==null)
{
return list;
}
LinkedList<TreeNode> queue=new LinkedList<TreeNode>(); //定义一个LinkedList集合,其类型是TreeNode
queue.offer(root); //首先把根进入队列中
while(!queue.isEmpty()) //队列不为空的
{
int num=queue.size(); //队列的长度;
List<Integer> templist=new ArrayList<Integer>(); //定义一个ArrayList集合
while(num>0)//首先判断num是否大于0先获取每一层的结点个数。
{
TreeNode node=queue.peek(); //查看队头元素,但是不删除队头的元素,队列是先进先出的规则
if(node.left!=null) //该节点的左孩子不为空
{
queue.offer(node.left); //将左孩子进入队尾
}
if(node.right!=null) //如果该节点的右孩子不为空
{
queue.offer(node.right); //将右孩子进入队尾。
}
int data=queue.poll().val; //将节点从队头出队// 。
templist.add(data); //将出的节点加入到tempList集中
num--; //然后每次减1.
}
list.add(templist);
}
return list;
}
public static void main(String []args)
{
Test2 test=new Test2();
Scanner scan=new Scanner(System.in);
TreeNode root=new TreeNode(3);
TreeNode p2=new TreeNode(9);
TreeNode p3=new TreeNode(20);
TreeNode p4=new TreeNode(15);
TreeNode p5=new TreeNode(7);
root.left=p2;
root.right=p3;
p3.left=p4;
p3.right=p5;
List<List<Integer>> list=test.levelOrder(root);
Iterator<List<Integer>> it1=list.iterator();
while(it1.hasNext())
{
List<Integer> list2=it1.next();
Iterator<Integer> it2=list2.iterator();
while(it2.hasNext())
{
int data=it2.next();
System.out.print(data+" ");
}
System.out.println();
}
}
}
运行结果如下: