接上文《二叉树的四种遍历方式(一)》(https://blog.csdn.net/helloworldchina/article/details/128895188),在本文讲述一下第四种遍历方式,即按层次遍历二叉树。
一 讲解
1 先序遍历二叉树, 见《二叉树的四种遍历方式(一)》(https://blog.csdn.net/helloworldchina/article/details/128895188)
2 中序遍历二叉树, 同上;
3 后序遍历二叉树, 同上;
4 层次遍历二叉树, 见下:
按层次遍历二叉树的定义是:
从根开始,按层次的递增顺序和每层从左到右的顺序进行遍历。对于上文中的二叉树,若按层次从左到右进行遍历,则有以下序列:ABFCEGDHI.
要实现按层次遍历,需要使用一个队列来存放要访问的节点,并将节点的值存入新的队列,遍历按照以下方式进行:
1) 先访问根节点,将根节点的值插入新队列;
2) 重复执行以下操作:从队列中取出头节点,依次访问该节点的左孩子、右孩子,直至队列为空;且每个节点访问后,就将该节点的值插入新队列。
二 代码
见方法levelTraveral,其它代码可参见《二叉树的四种遍历方式(一)》(https://blog.csdn.net/helloworldchina/article/details/128895188):
/**
* 按照层次遍历二叉树,使用队列(先进先出)实现。
*/
public void levelTraveral(Node node){
System.out.print("按照层次遍历二叉树,使用队列实现:");
System.out.println();
//节点个数
int num=0;
if (node==null){
return;
}
//1、创建二叉树节点队列
Queue<Node> queue = new LinkedList<>();
//2 创建一个存储二叉树中值的队列
Queue<Object> queueData = new LinkedList<>();
//3、二叉树节点入队
queue.add(node);
//4 二叉树节点值入队
queueData.add(node.value);
//队列中有元素则进入循环
if (queue.size()!=0) {
num++;
};
while (queue.size()!=0){
//按照栈中元素的个数进行出队循环
int len = queue.size();
for(int i = 0;i<len;i++){
//根节点出队
Node temp = queue.poll();
System.out.print(temp.value+" ");
//如果根节点有左子节点,左子节点入队
if (temp.leftNode!=null) {
queue.add(temp.leftNode);
queueData.add(temp.value);
num++;
}
//如果根节点有左子节点,左子节点入队
if (temp.rightNode!=null) {
queue.add(temp.rightNode);
queueData.add(temp.value);
num++;
}
}
}
System.out.println();
System.out.println("queueData size="+queueData.size());
System.out.println("num="+num);
}
package cytdemo;
/**
* 二叉树遍历测试
* @author Gyl
* @date 2023/2/5
*/
public class TestBinaryTree {
public static void main(String[] args) {
//手动创建节点
Node node9 = new Node("I",null,null);
Node node8 = new Node("H",null,null);
Node node7 = new Node("G",node8,node9);
Node node6 = new Node("F",null,node7);
Node node5 = new Node("D",null,null);
Node node4 = new Node("E",null,null);
Node node3 = new Node("C",null,node5);
Node node2 = new Node("B",node3,node4);
Node node1 = new Node("A",node2,node6);
//通过根节点创建一个二叉树对象
BinaryTree bTree=new BinaryTree(node1);
//判断是否为空
System.out.println("是否为空:"+bTree.isEmpty());
//层次遍历,递归实现
System.out.println();
System.out.println("输出层次遍历:");
bTree.levelTraveral(node1);
}
三 展示