一、层次遍历
层次遍历即为从上到下,从左到右依次访问二叉树的每个结点。
二、层次遍历实现
1、实现思路
(1)我们定义一个队列,先将根结点入队;
(2)当前结点是队头结点,将其出队并访问;
(3)若当前结点的左结点不为空将左结点入队;若当前结点的右结点不为空将其入队即可。
2、实现代码
public class LevelOrder {
static List<Integer> levellist=new ArrayList<>();
public static void levelorder(TreeNode root) {
if(root==null) {//空树
return;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);//offer方法表示添加元素到队尾
while(!queue.isEmpty()) {
TreeNode temp=queue.poll();//poll方法删除队头元素
levellist.add(temp.val);
if(temp.left!=null) {
queue.offer(temp.left);
}
if(temp.right!=null) {
queue.offer(temp.right);
}
}
}
三、完整代码实现
package Tree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class TreeNode {//二叉树结点定义
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class LevelOrder {
static List<Integer> levellist=new ArrayList<>();
public static void levelorder(TreeNode root) {
if(root==null) {//空树
return;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);//offer方法表示添加元素到队尾
while(!queue.isEmpty()) {
TreeNode temp=queue.poll();//poll方法删除队头元素
levellist.add(temp.val);
if(temp.left!=null) {
queue.offer(temp.left);
}
if(temp.right!=null) {
queue.offer(temp.right);
}
}
}
public static void main(String[] args) {
TreeNode root=new TreeNode(7);//创建二叉树
TreeNode a=new TreeNode(4);
TreeNode b=new TreeNode(9);
TreeNode c=new TreeNode(2);
TreeNode d=new TreeNode(5);
TreeNode e=new TreeNode(8);
TreeNode f=new TreeNode(11);
TreeNode g=new TreeNode(1);
TreeNode h=new TreeNode(3);
TreeNode i=new TreeNode(10);
TreeNode j=new TreeNode(12);
root.left=a;
root.right=b;
a.left=c;
a.right=d;
b.left=e;
b.right=f;
c.left=g;
c.right=h;
f.left=i;
f.right=j;
levelorder(root);//层次遍历
for(int m=0;m<levellist.size();m++) {
System.out.print(levellist.get(m)+" ");
}
}
}
运行结果:
7 4 9 2 5 8 11 1 3 10 12
该实例的二叉树图如下图所示:
PS:
java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。但Queue使用时要尽量避免Collection的add()和remove()方法。一般我们使用offer()和poll()来对队列进行添加删除元素。
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
Queue的部分方法: