08.Java數據結構與算法分析~順序存儲二叉樹
本文是上一篇文章的後續,詳情點擊該鏈接
順序存儲二叉樹的概念
從數據存儲來看,數組存儲方式和樹的存儲方式可以相互轉換。
也就是說,數組可以轉換成樹,樹也可以轉換成數組。
順序存儲二叉樹的特點:
1.順序二叉樹通常只考慮完全二叉樹
2.第n個元素的左子結點爲2*n+1
3.第n個元素的右子結點爲2*n+2
4.第n個元素的父結點爲(n-1)/2
n表示二叉樹中第幾個元素(按0開始編號)
定義Tree接口
public interface Tree {
//先序遍歷
void PreOrder();
//中序遍歷
void InfixOrder();
//後序遍歷
void PostOrder();
}
ArrBinaryTree實現類
public class ArrBinaryTree implements Tree {
private Object[] arr; //存儲數據結點的數組
//構造器傳值
public ArrBinaryTree(Object[] arr){
this.arr = arr;
}
//前序遍歷
public void PreOrder(int index){
//如果數組爲空,或者數組長度 = 0
if(arr == null || arr.length == 0){
throw new NullPointerException();
}
//輸出當前元素
System.out.print(arr[index] + " ");
//向左遞歸遍歷
if((index * 2 + 1) < arr.length) {
PreOrder(2 * index + 1);
}
//向右遞歸遍歷
if((index * 2 + 2) < arr.length){
PreOrder(index * 2 + 2);
}
}
//中序遍歷
public void InfixOrder(int index) {
//如果數組爲空,或者數組長度 = 0
if(arr == null || arr.length == 0){
throw new NullPointerException();
}
//向左遞歸遍歷
if((index * 2 + 1) < arr.length) {
InfixOrder(2 * index + 1);
}
//輸出當前元素
System.out.print(arr[index] + " ");
//向右遞歸遍歷
if((index * 2 + 2) < arr.length){
InfixOrder(index * 2 + 2);
}
}
//後序遍歷
public void PostOrder(int index) {
//如果數組爲空,或者數組長度 = 0
if(arr == null || arr.length == 0){
throw new NullPointerException();
}
//向左遞歸遍歷
if((index * 2 + 1) < arr.length) {
PostOrder(2 * index + 1);
}
//向右遞歸遍歷
if((index * 2 + 2) < arr.length){
PostOrder(index * 2 + 2);
}
//輸出當前元素
System.out.print(arr[index] + " ");
}
//先序,中序,後序遍歷 方法重載
public void PreOrder(){
this.PreOrder(0);
}
public void InfixOrder(){
this.InfixOrder(0);
}
public void PostOrder(){
this.PostOrder(0);
}
}
測試
public static void main(String[] args) {
Integer[]arr = {1,2,3,4,5,6,7};
Tree tree = new ArrBinaryTree(arr);
//前序遍歷
tree.PreOrder();System.out.println();
//中序遍歷
tree.InfixOrder();System.out.println();
//後序遍歷
tree.PostOrder();
}