LeetCode前置課-4-哈希表、樹、圖

1、哈希表

2、樹

public class TreeNode {
    private int no;
    private TreeNode leftNode;
    private TreeNode rightNode;

    public TreeNode(int no) {
        this.no = no;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public TreeNode getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(TreeNode leftNode) {
        this.leftNode = leftNode;
    }

    public TreeNode getRightNode() {
        return rightNode;
    }

    public void setRightNode(TreeNode rightNode) {
        this.rightNode = rightNode;
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "no=" + no +
                ", leftNode=" + leftNode +
                ", rightNode=" + rightNode +
                '}';
    }
    //前序遍歷
    public void  preOrder(){
        System.out.println(this);
        if(this.leftNode!=null){
            this.leftNode.preOrder();
        }
        if(this.rightNode!=null){
            this.rightNode.preOrder();
        }
    }
    //中序遍歷
    public void infixOrder(){
        if(this.leftNode!=null){
            this.leftNode.infixOrder();
        }
        System.out.println(this);
        if(this.rightNode!=null){
            this.rightNode.infixOrder();
        }
    }
    //後序遍歷
    public void postOrder(){
        if(this.leftNode!=null){
            this.leftNode.postOrder();
        }
        if(this.rightNode!=null){
            this.rightNode.postOrder();
        }
        System.out.println(this);
        int[] a =  {1,2};
        Arrays.copyOfRange(a, 1, 2);
    }
    //前序遍歷查找,num是要查找的結點數據
    public TreeNode preOrderSearch(int num){
        if(this.no==num){
            return this;
        }
        //因爲是前序遍歷所以先判斷左子樹
        TreeNode resNode = null;
        if(this.leftNode!=null){
            this.leftNode.preOrderSearch(num);
        }
        if(resNode!=null){//說明找到了
            return resNode;
        }
        if(this.rightNode!=null){
           resNode =  this.rightNode.preOrderSearch(num);
        }
        if(resNode!=null){
            return resNode;
        }
        return resNode;
    }
}
//順序二叉樹(堆排序就會使用順序存儲二叉樹)
第n個節點的左子節點是2n+1;第n個節點的右子節點是2n+1,父節點是(n-1)/2,n是數組下標,也表示二叉樹的第幾個元素


//線索二叉樹,二叉樹n個節點有n+1個空指針域,利用空指針域存放指向該節點的前驅和後繼節點,有前序線索二叉樹,中序線索二叉樹,和後續線索二叉樹。

//堆排序,升序需要用大頂堆,降序需要用小頂堆
    public static  void heapSort(int arr[]){
        int temp =0;
        //構建大頂堆
        for(int i=arr.length/2-1;i>0;i--){
            adjustHeap(arr,i,arr.length);
        }
        for(int j=arr.length-1;j>0;j--){
            //交換
            temp=arr[j];
            arr[j]=arr[0];
            arr[0] = temp;
            adjustHeap(arr,0,j);
        }
    }
    //構建大頂堆,length會逐漸變短,i表示在數組中的索引
    public static  void adjustHeap(int arr[], int i, int length){
        int temp= arr[i];
        for(int k=i*2+1;k<arr.length;k=k*2+1){//i*2+1是i節點的左子節點
            if(k+1<length && arr[k]<arr[k+1]){//說明左子節點小於右子節點
                k++;//k指向右子節點
            }
            if(arr[k]>temp){//子節點當中的最大節點和當前節點比較
                arr[i]=arr[k];
                i=k;//繼續循環比較
            }
        }
        //循環結束,將當前值放回給最終交換的位置
        arr[i]=temp;
    }
//赫夫曼樹(WPL最小的樹就是赫夫曼樹,在網絡中的應用是赫夫曼編碼實現解壓縮等)
//二叉排序樹BST,任何一個非葉子結點要求左子節點的值比當前節點小,右子節點的值比當前節點大,刪除時要判斷刪除的節點包含幾個節點,根據情況不同進行刪除

//平衡二叉樹(AVL樹,二叉搜索樹),因爲二叉排序樹不平衡,可能變成類似列表的情況,查詢速度明顯降低。
他的左右子樹的高度差的絕對值不超過1;實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹
public int height(){//計算當前節點樹的高度
    return Math.max(leftNode==null?0 : leftNode.height(),rightNode==null?0 : rightNode.height());
}
//左旋

//右旋

3、多叉樹:2-3樹、B-樹(B樹)、B+樹、B*樹

4、圖:

/**
 * Created by qililong on 2020/7/6.
 * 圖,有鄰接矩陣、鄰接表
 */
public class Graph {
    //鄰接矩陣方式
    //插入節點
    private ArrayList<String> vertexList;//存儲頂點集合
    private int[][] edges;//存儲圖的鄰接矩陣

    private boolean[] isVisited; //記錄節點是否被訪問
    public void insertVertex(String vertex){
        vertexList.add(vertex);
    }
}

深度優先:

                        

廣度優先:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章