顺序存储二叉树的特点(通常只考虑完全二叉树):
- 1.第n个元素(下标为n的元素)的左子节点为 2n+1 此公式对应数组下标
- 举例: 假设n是二叉树里元素的值-1(因为数组的下标从0开始),对应数组里的下标
- 假设二叉树数据为6(下标为5),公式为 2*5-1=9 9是数组的下标,9是6(即n+1)的左子节点。
- 2.第n个元素的右子节点为 2n+2 同上
- 3.第n个元素的父节点为 (n-1)/2 ==》向下取整
来个图:
代码实现:
package tree;
public class ArrToBinaryTree {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7};
//测试
ArrayBinaryTree a = new ArrayBinaryTree(arr);
System.out.println("前序");
a.preOrder();
System.out.println();
System.out.println("中序");
a.midOrder();
System.out.println();
System.out.println("后序");
a.postOrder();
}
}
//实现数组到二叉树的转化并且遍历
class ArrayBinaryTree {
//存储二叉树节点的数组
private int[] arr;
public ArrayBinaryTree(int[] arr) {
this.arr = arr;
}
public void preOrder(){
this.preOrder(0);
}
public void midOrder(){
this.midOrder(0);
}
public void postOrder(){
this.postOrder(0);
}
//完成顺序存储到二叉树的前序遍历
//n为数组下标
public void preOrder(int n) {
if (arr.length == 0 || arr == null) System.out.println("数组为空,不能前序遍历");
//输出当前节点
System.out.print(arr[n]+" ");
//左递归遍历
if ((2 * n + 1) < arr.length) preOrder(2 * n + 1);
//右
if ((2 * n + 2) < arr.length) preOrder(2 * n + 2);
}
//中序
public void midOrder(int n ){
if (arr.length == 0 || arr == null) System.out.println("数组为空,不能中序遍历");
//左递归遍历
if ((2 * n + 1) < arr.length) preOrder(2 * n + 1);
System.out.print(arr[n]+" ");
if ((2 * n + 2) < arr.length) preOrder(2 * n + 2);
}
//中序
public void postOrder(int n ){
if (arr.length == 0 || arr == null) System.out.println("数组为空,不能后序遍历");
if ((2 * n + 2) < arr.length) preOrder(2 * n + 2);
if ((2 * n + 1) < arr.length) preOrder(2 * n + 1);
System.out.print(arr[n]+" ");
}
}
打印结果: