二叉树的分层遍历
二叉树的分层遍历, 换行打印。
下面的代码将解释如何实现换行打印。
- 分层遍历使用队列queue,按层次将节点推入队列,并在弹出时将节点的左右节点推入队列。
- 换行打印使用for循环,定义n=队列长度,遍历该行的所有节点后,跳出for循环,打印换行,再重新赋值队列长度n,重新进入下一行的for循环。
//定义Treenode
class Treenode{
int val;
Treenode left;
Treenode right;
//构造函数
Treenode(int val){
this.val=val;
left=null;
right=null;
}
}
//遍历方法
public static void LevelTraverse(Treenode root){
Queue<Treenode> queue=new LinkedList<>();
queue.offer(root);//将根节点推入队列,此时队列长度为1
//特殊判断,如果传入的节点为空,直接退出
if(root==null)
return;
//用isEmpty()判断队列非空条件
while(!queue.isEmpty()){
int n=queue.size(); //定义n=队列长度,此时n=1。第一回合for循环结束后将重新赋值
for(int i=0;i<n;i++){
//第一回合n=1,所以for循环只执行一次,打印二叉树的根节点root
Treenode cur=queue.poll(); //定义指针cur,将弹出的节点赋给指针
System.out.print(cur.val+" "); //将弹出的节点打印出来
if(cur.left!=null){
queue.offer(cur.left); //如果弹出节点有左节点,则将左节点推入队列
}
if(cur.right!=null){
queue.offer(cur.right);
}
}//for循环结束. 第一回合结束时,根节点root弹出队列,根节点的左右节点(如果存在)将会推入队列,
//此时队列长度为2,下一回合for循环将执行两次,打印第二层的2个节点
System.out.println();
}
}
总结
每次将第前一行的节点打印并且弹出后,都会将下一行的所有子节点推入队列。因此每当一回合的for循环结束时,队列长度将被重新赋值为下一行子节点的个数。因此,打印换行的代码只需插入到for循环之后。
赋值队列长度n—>for循环执行n次打印n个节点—>打印换行—>赋值队列长度n…依次循环。