树的广度优先插入以及广度优先遍历(二叉树)
重点:树的广度操作
二叉树的广度优先插入借助队列来实现
一、对二叉树的认识:二叉树是每个结点最多有两个子树的树结构。
二、本文主要是对树的广度优先插入进行操作。
三、原理解析:
1、首先建立一个队列(链接: 循环队列的最优实现)
源码如下:
public class CilQueDemo<T> {
private T[] arr = (T[]) new Object[20];
private int top = 0;
private int start = 0;
public void push(T n) {
arr[top % arr.length] = n;
top++;
if(top - start == arr.length) {
T[] arrnew = (T[]) new Object[arr.length * 2];
for(int i = 0 ;i < arrnew.length;i++) {
arrnew[i] = arr[(start + i) % arr.length];
}
arr = arrnew;
top = top -start;
start = 0;
}
}
public T get() {
if(top == start) {
return null;
}
T result = arr[start % arr.length];
start++;
if(top - start < arr.length/4) {
int len = arr.length / 2;
if(len<20) {
len = 20;
}
T[] arrnew = (T[]) new Object[len];
for(int i = 0 ;i < arrnew.length;i++) {
arrnew[i] = arr[(start + i) % arr.length];
}
arr = arrnew;
top = top -start;
start = 0;
}
return result;
}
}
2、建立二叉树的结点结构:
结点结构如下:
代码实现:
public class Tree {
public int value;
public Tree left;
public Tree right;
//重写toString方法,便于查看二叉树
@Override
public String toString() {
return "Tree [value=" + value + ", left=" + left + ", right=" + right + "]";
}
}
3、建立过程:(给定数组,建立二叉树)
(1)建立根节点,将数组的第一个值赋给根结点的value。
Tree root = new Tree();
root.value = arr[0];
(2)建立队列,并将根结点存到队列中
(3)进行广度优先插入:
插入使用for循环,进入循环第一步先将队列中的第一个出队,然后依次将数组中的元素赋给结点的value,再插入过程中需要建立左右子树,分别由上一结点的left、right指向,并依次进入队列。
(4)树的广度优先遍历:
借助队列实现。
首先将插入好了的二叉树的根结点入队,根据对列是否为空进行循环,在遍历的时候当左子树不为空的时候,将左子树入队,右子树同等操作。
(5)代码实现:
public class Test {
public static void main(String[] args) {
int[] arr = {1,4,7,2,43,12,66,43,21,87,67,54,32,11,0};
//广度优先插入
Tree root = new Tree();
root.value = arr[0];
CilQueDemo<Tree> queue = new CilQueDemo<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);
viewTree(root);//遍历
}
//广度优先遍历
public static void viewTree(Tree root) {
CilQueDemo<Tree> queue = new CilQueDemo<Tree>();
queue.push(root);
while(queue!=null) {
Tree newtree = queue.get();
if(newtree==null) {
break;
}
System.out.print(newtree.value + " ");
if(newtree.left!=null) {
queue.push(newtree.left);
}
if(newtree.right!=null) {
queue.push(newtree.right);
}
}
}
}
通过以上操作便可实现树的广度优先插入以及遍历。