层次遍历:
从上到下再从左到右(树的广度优先,需要用到队列)
1.把根放到队列中,
2,循环直到队列为空
1)把队首结点取出
2)把队首结点的左右孩子取出(无得话,不插入)
//层次遍历
public static void levelOrderTraversal(Node root){
if(root==null){
return;
}
Queue<Node> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
Node front=queue.remove();
System.out.println(front.value);
if(front.left!=null){
queue.add(front.left);
}
if(front.right!=null){
queue.add(front.right);
}
}
}
还有一种方法是利用二维数组的形式写出,例如
写出二维数组的形式要一层一层进行打印,此时就需要二叉树的层数(层数从0开始),如果层数和二维数组的大小相等了,那就需要在二维数组中增加一个一位数组,进到下一层。其余和上述方法相似
//层次遍历利用二维数组形式写出
public static class Element{
int level;
Node node;
}
public static List<List<Character>>levelOrder(Node root){
List<List<Character>> retList=new ArrayList<>();
if(root==null){
return retList;
}
Queue<Element> queue=new LinkedList<>();
Element e=new Element();
e.node=root;
e.level=0;
queue.add(e);
while(!queue.isEmpty()){
Element front=queue.remove();
if(front.level==retList.size()){
retList.add(new ArrayList<>());
}
retList.get(front.level).add(front.node.value);
if(front.node.left!=null){
Element l=new Element();
l.node=front.node.left;
l.level=front.level+1;
queue.add(l);
}
if(front.node.right!=null){
Element m=new Element();
m.node=front.node.right;
m.level=front.level+1;
queue.add(m);
}
}
return retList;
}