一、非递归方法,使用一个队列保存访问过的元素
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
/**
* @author:fangxuan
* @date:2015年10月13日
* @description:
*/
public class BinaryTree {
private static final int[] data = {1,2,3,4,5,6,7};
private static int index=0;
private Queue<Node> queue = new ArrayBlockingQueue<Node>(10);
public Node root;
/**
* 按层创建二叉树,完全二叉树
*/
private void create(){
if(index>=data.length)
return;
// 根结点
if(root == null){
root = new Node();
root.value = data[index++];
}
queue.add(root);
while(!queue.isEmpty()){
if(index>=data.length)
return;
Node n = queue.poll();
// 左孩子
n.left = new Node();
n.left.value=data[index++];
queue.add(n.left);
if(index>=data.length)
return;
// 右孩子
n.right = new Node();
n.right.value=data[index++];
queue.add(n.right);
}
}
/**
* 按层遍历
*/
public void levelTraverse(){
if(root==null)
return;
Queue<Node> q = new ArrayBlockingQueue<Node>(10);
System.out.print(root.value+" ");
q.add(root);
while(!q.isEmpty()){
Node n = q.poll();
if(n.left!=null){
System.out.print(n.left.value+" ");
q.add(n.left);
}
if(n.right!=null){
System.out.print(n.right.value+" ");
q.add(n.right);
}
}
}
/**
* 先序遍历
*/
public void preOrder(){
preOrder(root);
}
/**
* 先序遍历的递归算法
* @param root
*/
private void preOrder(Node root){
if(root == null)
return;
System.out.print(root.value+" ");
preOrder(root.left);
preOrder(root.right);
}
public static void main(String[] args){
BinaryTree tree = new BinaryTree();
tree.create();
tree.preOrder();
System.out.println();
tree.levelTraverse();
}
}
class Node {
public int value;
public Node left;
public Node right;
}