存储二叉树时,我们一般都用的是数组,不过在访问的时候是通过数组的下标来模拟访问!
使用数组存放时只能从0开始存储,但是我们可以通过一定的规则对数组进行遍历就可以得到二叉树的的遍历的结果,下面我们先看一个遍历的规则:
顺序存储二叉树的特点:(这里的n指的是元素当前的索引值 )
1.顺序二叉树通常只考虑完全二叉树
2.第n个元素的左子节点为: 2*n + 1
3.第n个元素的右子节点为: 2 *n + 2 (因为它是右子树所以在左子树的基础上加1)
4.第n个元素的父节点为:(n - 1)/2
下面我先给大家举几个栗子:
比如我要找3的左子树,那么它的索引就为2,通过计算左子树的公式:2 * 2 +1 = 5,它的左子树对应的索引 值 就为5,
如果我们一直按照这样的规则遍历数组,就可以实现二叉树的先序、中序、后序遍历:
下面我们上代码来就明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| public class ArrayBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
System.out.println("先序遍历后的数组为:"); arrayBinaryTree.preOrder(); System.out.println();
System.out.println("中序遍历后的数组为:" ); arrayBinaryTree.middleOrder(); System.out.println();
System.out.println("后序遍历后的数组为:"); arrayBinaryTree.postOrder(); } }
class ArrayBinaryTree{ private int[] arr;
public ArrayBinaryTree(int[] arr) { this.arr = arr; }
public void preOrder(){ this.preOrder(0); }
public void middleOrder(){ this.middleOrder(0); }
public void postOrder(){ this.postOrder(0); }
public void preOrder(int index){ if (arr == null || arr.length == 0) { System.out.println("数组为空,不能按照二叉树的前序遍历"); }
System.out.print(arr[index] + "\t"); if (index * 2 + 1 < arr.length) { preOrder(2 * index + 1); }
if ((index * 2 + 2) < arr.length) { preOrder(2 * index + 2); } }
public void middleOrder(int index){ if (arr == null || arr.length == 0) { System.out.println("数组为空,不能按照中序遍历的方式遍历!"); } if (index * 2 + 1 < arr.length) { middleOrder(2 * index + 1); } System.out.print(arr[index] + "\t"); if (index * 2 + 2 < arr.length) { middleOrder(2 * index + 2); } }
public void postOrder(int index){ if (arr == null || arr.length == 0) { System.out.println("数组为空,不能按照后序遍历的方式遍历!"); } if (index * 2 + 1 < arr.length) { postOrder( 2 * index + 1); } if (index * 2 + 2 < arr.length) { postOrder(2 * index +2); } System.out.print(arr[index] + "\t"); } }
|
运行结果
我们就成功的使用公式实现了二叉树的先序、中序、后序的遍历,如果本文中有哪个地方有误,希望大家多多指正!