顺序存储二叉树
- 顺序存储二叉树的特点:
1.顺序存储二叉树通常只考虑完全二叉树
2.第n个元素的左子结点为 2 * n + 1
3.第n个元素的右子结点为 2 * n + 2
4.第n个元素的父节点为(n-1)/ 2
注:n表示二叉树中的第几个元素(按0开始编号)
- 顺序存储二叉树的前序遍历
/**
* 顺序存储二叉树的前序遍历
*
* @param index 数组下标
*/
public void preOrder(int index) {
// 如果数组为空或者数组的长度为0
if (arr == null || arr.length == 0) {
System.out.println("数组为空,不能按照二叉树的前序遍历");
return;
}
// 输出当前数组元素
System.out.println(arr[index]);
if ((2 * index + 1) < arr.length) {
preOrder((2 * index + 1));
}
if ((2 * index + 2) < arr.length) {
preOrder((2 * index + 2));
}
}
- 中序
public void infixOrder(int index) {
if (arr == null || arr.length == 0) {
System.out.println("数组为空,不能按照二叉树的中序遍历");
return;
}
if ((2 * index + 1) < arr.length) {
infixOrder((2 * index + 1));
}
System.out.println(arr[index]);
if ((2 * index + 2) < arr.length) {
infixOrder((2 * index + 2));
}
}
- 后序
public void postOrder(int index) {
if (arr == null || arr.length == 0) {
System.out.println("数组为空,不能按照二叉树的后序遍历");
return;
}
if ((2 * index + 1) < arr.length) {
postOrder((2 * index + 1));
}
if ((2 * index + 2) < arr.length) {
postOrder((2 * index + 2));
}
System.out.println(arr[index]);
}
完整代码:
class ArrBinaryTree {
private int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
// 需要从根结点开始遍历
public void preOrder() {
this.preOrder(0);
}
public void infixOrder() {
this.infixOrder(0);
}
public void postOrder() {
this.postOrder(0);
}
public void preOrder(int index) {
if (arr == null || arr.length == 0) {
System.out.println("数组为空,不能按照二叉树的前序遍历");
return;
}
System.out.println(arr[index]);
if ((2 * index + 1) < arr.length) {
preOrder((2 * index + 1));
}
if ((2 * index + 2) < arr.length) {
preOrder((2 * index + 2));
}
}
public void infixOrder(int index) {
if (arr == null || arr.length == 0) {
System.out.println("数组为空,不能按照二叉树的中序遍历");
return;
}
if ((2 * index + 1) < arr.length) {
infixOrder((2 * index + 1));
}
System.out.println(arr[index]);
if ((2 * index + 2) < arr.length) {
infixOrder((2 * index + 2));
}
}
public void postOrder(int index) {
if (arr == null || arr.length == 0) {
System.out.println("数组为空,不能按照二叉树的后序遍历");
return;
}
if ((2 * index + 1) < arr.length) {
postOrder((2 * index + 1));
}
if ((2 * index + 2) < arr.length) {
postOrder((2 * index + 2));
}
System.out.println(arr[index]);
}
}