二叉树的广度优先插入
- 二叉树结构
public class Tree {
public int value;
public Tree left;
public Tree right;
@Override
public String toString() {
return "Tree{" +
"value=" + value +
", left=" + left +
", right=" + right +
'}';
}
}
- 队列结构
二叉树的广度优先插入要配合队列使用,队列用来确定要插入的下一个节点
public class QueueTest< T > {
private T[] data = (T[]) new Object[20];
private int start = 0;
private int end = 0;
public void push(T newint) {
if( end - start == data.length ) {
T[] datanew = (T[]) new Object[ data.length * 2 ];
for(int i = 0; i < data.length; i++) {
datanew[i] = data[ ( start + i ) % data.length ];
}
start = 0;
end = start + data.length;
data = datanew;
}
data[ end % data.length ] = newint;
end++;
}
public T get() {
if( end == start ) {
return null;
}
T result = data[start % data.length];
start++;
return result;
}
}
采用循环队列的结构,若队列已满,则容量扩充为原来的二倍
- 建树过程
若数组遍历至最后,则 i+1越界,所以要对i+1进行越界判断
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,4,7,2,43,12,66,43,21,87,67,54,32,11,0,55};
Tree root = new Tree();
root.value = arr[0];
QueueTest<Tree> queue = new QueueTest<Tree>();
queue.push(root);
for(int i = 1; i < arr.length;) {
Tree newtree = queue.get();
Tree nodel = new Tree();
nodel.value = arr[ i ];
newtree.left = nodel;
queue.push(nodel);
if(i+1<arr.length){
Tree noder = new Tree();
noder.value = arr[ i+1 ];
newtree.right = noder;
queue.push(noder);
} else{
break;
}
i += 2;
}
System.out.println(root);
}
-广度优先遍历
广度优先遍历同广度优先插入一样,都要配合队列来使用
public static void viewTree(Tree root){
QueueTest<Tree> queue = new QueueTest<Tree>();
queue.push(root);
while(queue!=null){
Tree node=queue.get();
if(node!=null) {
if (node.left != null) {
queue.push(node.left);
}
if (node.right != null) {
queue.push(node.right);
}
System.out.println(node.value);
}else{
break;
}
}
}