非递归解法:
class Node
{
int val;
Node left;
Node right;
public Node(int val)
{
this.val=val;
}
}
class Solution
{
//传入根节点
public static ArrayList levelOrderTraverse(Node root)
{
//最后的结果数组是“数组的数组”形式
//比如:[[1],[2,3],[4,5,6,7]]
ArrayList result=new ArrayList();
if(root==null)
{
return result;
}
//创建队列,队列里装的是结点
Queue queue=new LinkedList();
//将根节点入队列,此时root就是队头结点
queue.offer(root);
//只要队列不为空,就一直循环(开始时队列中有头结点这一个数,队列不为空,进入循环)
while(queue.isEmpty()==false)
{
//统计出此时队列的长度,此时队列的长度是多少,就说明这一层有几个结点,这句话非常非常非常关键
int size=queue.size();
//每一层的节点的值用一个数组来装,装完一层就把这个数组添加到结果数组中
//注意里面装的是结点的值,不是结点
ArrayList temp=new ArrayList();
for(int i=0;i<size;i++)
{
//queue.poll()方法表示返回队头元素,并且在队列中删除
// 所以这里会把队头结点删除并且赋给current
Node current=(Node)queue.poll();
//将刚刚删除的队头结点的值添加到temp数组中
temp.add(current.val);
if(current.left!=null)
{
queue.add(current.left);
}
if(current.right!=null)
{
queue.add(current.right);
}
}
result.add(temp);
}
return result;
}
}
public class test
{
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.right.right = new Node(8);
Solution solution = new Solution();
ArrayList a = solution.levelOrderTraverse(root);
System.out.println(a);
//[[1], [2, 3], [4, 8]]
}
}
核心代码就是这一段:
Node current=(Node)queue.poll();
//将刚刚删除的队头结点的值添加到temp数组中
temp.add(current.val);
if(current.left!=null)
{
queue.add(current.left);
}
if(current.right!=null)
{
queue.add(current.right);
}