08.Java數據結構與算法分析~順序存儲二叉樹

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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章