从上到下打印二叉树
剑指offer第32题:用队列来实现打印二叉树,从上到下按行来打印
贴代码:(有注释)
public class Main {
/**
* 一边打印一边入队
* @param root
*/
public void PrintTopBottom(Node root){
if(root==null){
return ;
}
//用来存放节点的数组实现的队列
Deque<Node> deque=new ArrayDeque<>();
//先把头方进入
deque.add(root);
//每次判断,其实每次都不会为空,只有打印完了才会空
while(deque.size()!=0){
//用pNode来指向每次新添加队列的元素,也就是将要出队列的元素
Node pNode=deque.peekFirst();
//让队首元素出队
deque.pollFirst();
//打印出去的队首元素(其实我很疑惑,为什么元素都出去了,你能找到要打印哪个?
// 原来这个元素在树中,树的结构没变,
// 所以元素不会丢失,在这里说怕就是有其他人和我一样钻牛角尖)
System.out.println(pNode.data);
//如果左子节点不为空,就从队尾入队
if(pNode.left!=null){
deque.add(pNode.left);
}
//如果右子节点不为空,就从队尾入队
if(pNode.right!=null){
deque.add(pNode.right);
}
}
}
}
class Node{
int data;
Node left;
Node right;
Node(int data){
this.left=null;
this.right=null;
this.data=data;
}
}
我在这里也借鉴了其他同学的代码,是用ArrayList来实现的,代码也贴在这里:
public class Main {
public ArrayList<Integer> PrintFromTopToButtom(Node root){
ArrayList<Integer> list=new ArrayList<>();
//模拟一个队列,使用ArrayList来实现
ArrayList<Node> queue=new ArrayList<>();
if(root==null){
return null;
}
queue.add(root);
while(queue.size()!=0){
//将队列中的第一个元素移除,也就是将队首元素移除
Node tmp=queue.remove(0);
//如果将要移除的节点有左子节点,则加入队列中
if(tmp.left!=null){
queue.add(tmp.left);
}
//如果将要移除的节点有右子节点,则加入队列中
if(tmp.right!=null){
queue.add(tmp.right);
}
//把值放入到list中
list.add(tmp.data);
}
return list;
}
}
class Node{
int data;
Node left;
Node right;
}