层序遍历就是按照每一层,一层一层的访问节点。
1 先把根节点放入队列
2 如果队列不为空,取出队列头节点,访问该节点,判断该节点有无左右节点,如果有,放入队列,依次循环。
队列代码:
package com.cxbl;
public class LoopQueue<E> {
private Object[] data = null;
private int maxSize; //队列容量
private int front; //队头
private int rear; //队尾
private int size = 0;
public int size(){
return size;
}
public boolean isEmpty(){
return front == rear;
}
public LoopQueue(int initSize){
if(initSize>0){
data = new Object[initSize];
maxSize = initSize;
front = rear = 0;
}
}
public boolean add(E e){
if((rear+1) % maxSize == front){
//队列满
return false;
}else{
data[rear] = e;
rear = (rear+1)%maxSize;
size++;
return true;
}
}
public E remove(){
if(front == rear){
return null;
}
E e = (E) data[front];
data[front]=null;
front = (front+1)%maxSize;
size--;
return e;
}
}
层序遍历
public class Node {
int iDta;//id
double fData;//other data
Node leftChild;// 左子节点
Node rightChild;//右子节点
}
public class Tree {
private Node root;//根节点
/**
* 层序遍历
* @param root
* @return
*/
public void levelOrder() {
if(root==null)return;
LoopQueue<Node> queue= new LoopQueue<Node>(20);
queue.add(root);
while(!queue.isEmpty()){
Node temp = queue.remove();
System.out.println(temp.iDta);
if(temp.leftChild!=null){
queue.add(temp.leftChild);
}
if(temp.rightChild!=null){
queue.add(temp.rightChild);
}
}
}
}