二叉树的层序遍历-广度优先遍历
正常来讲二叉树的层序遍历 我们 使用递归 ,来进行 就可以得到正确答案,但是有时候递归比较难以理解,我们今天用队列的形式 来进行二叉树的层序遍历
我们使用队列对二叉树进行层序遍历的核心思想有两个
1. 我们用队列 记录二叉树每一层的元素
比如 现在有一个空队列 【】
一个二叉树的 结构如下
1.我们首先把根节点添加到 队列中去 【 1】
2.然后 我们判断 队列是否为空,来进入循环,根节点不为空 进入循环 ,
3.我们把他的左孩子 加入到队列,右孩子 加入到队列 现在队列 元素是 【1,2,3】
4.然后 我们把根节点出队打印,现在头节点变成2,队列元素为【2,3】
5.然后 我们再把头节点左右孩子加入队列 【2,3,4,5】然后头节点出队变成【3,4,5】,然后再把头节点左右孩子加入队列【3,4,5,6,7】然后头节点出队打印,依次循环,直到队列为空
下面来看一下代码实现
node节点
package tree;
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(TreeNode left,int val,TreeNode right){
this.left=left;
this.val=val;
this.right=right;
}
}
TreeNode node = new TreeNode(new TreeNode(new TreeNode(null,4,null),2,new TreeNode(null,5,null))
,1,
new TreeNode(new TreeNode(null,6,null),3,new TreeNode(null,7,null)));
ArrayDeque<TreeNode> queue=new ArrayDeque<>();
queue.add(node);
while (!queue.isEmpty()){
TreeNode treeNode = queue.poll();
System.out.print(treeNode.val);
if(treeNode.left!=null){
queue.add(treeNode.left);
}
if(treeNode.right!=null){
queue.add(treeNode.right);
}
}
但是呢这样得出来的结果是这样的
不够优雅,我们如何打印出一个树型结构的层序遍历呢?
首先我们分析 一个二叉树 如上图我画的那个二叉树,第一层 一个元素,第二层 两个元素,第三层是四个元素 ,我们可以打印出 每一层的元素之后,让该元素换行,就可以得到树形结构的二叉树,
但是我们怎么知道每一层的元素个数呢?我们可以引入一个临时变量,来记录我们每一层的元素个数,然后根据我们每一层添加的元素个数,来进行遍历打印
就比如 我们 第一层添加了一个根节点,那么我们就循环打印一次元素,然后记录下添加元素的个数,我们添加元素的个数也就是下一层循环应该遍历的次数
//广度优先遍历
TreeNode node = new TreeNode(new TreeNode(new TreeNode(null,4,null),2,new TreeNode(null,5,null))
,1,
new TreeNode(new TreeNode(null,6,null),3,new TreeNode(null,7,null)));
ArrayDeque<TreeNode> queue=new ArrayDeque<>();
queue.add(node);
int count=1;//表示现在队列中的元素 也就是二叉树的层数中的元素 也是for循环循环的次数
while (!queue.isEmpty()){
int count1=0;//记录循环中添加了几次元素 添加几次元素 就是 该二叉树层数 的元素个数
// 比如 第一层的节点 是1 左右两个孩子
for (int i = 0; i < count; i++) {
TreeNode node1 = queue.poll();
System.out.print(node1.val);
if (node1.left != null) {
queue.add(node1.left);
count1++;
}
if (node1.right != null) {
queue.add(node1.right);
count1++;
}
}
System.out.println();
count=count1;
}
得出来是这样的
就显示的比较优雅,如果想要更优雅,还可以自行加判断