壓縮演算法從入門到放棄之二叉樹(1)

天星技術團隊發表於2018-06-30

作者: 玄夜 時間: 2018.6.30


前言

演算法,永不過時!

幹碼農幹了好幾年了,感覺自己能拿出手的東西並不多啊,所以最近有了重新拾起演算法這塊的想法;

進入正題,這是一個壓縮演算法系列的文章,從最簡單的二叉樹開始寫,敬請關注。


一、二叉樹的簡介

二叉樹是資料結構中樹家族最為基礎的結構。

1、二叉樹應用場景:

①、哈夫曼編碼,簡單有效的壓縮演算法

②、快速排序、查詢

2、二叉樹的特性:

①、二叉樹的每個結點至多隻有二棵子樹;

②、二叉樹的子樹有左右之分,次序不能顛倒;

③、二叉樹的第i層至多有2i-1個結點;深度為k的二叉樹至多有2k-1個結點。

3、二叉樹的基本形態:

二叉樹是遞迴定義的,其結點有左右子樹之分:

Markdown

①空二叉樹——如圖(a);

②只有一個根結點的二叉樹——如圖(b);

③只有左子樹——如圖(c);

④只有右子樹——如圖(d);

⑤完全二叉樹——如圖(e)。

4.二叉樹的表達方法:

①、影象表達法,如圖:

Markdown

②、符號表達法:

以上圖為例(A,(B(D,E),C(F))

③、遍歷表達法:

先序遍歷為ABDECF

中序遍歷為DBEAFC

後序遍歷為DEBFCA


二、實戰

好了,上面寫的都是一些基本的知識點,現在直接上程式碼,簡單粗暴:

1、先建一個類
package com.jt.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by jay on 2018/6/30.
 */

public class Tree {

    private Tree root;//根節點
    private Tree left;//左節點
    private Tree right;//右節點
    private Object obj;//資料域
    private List<Tree> datas;//儲存所有節點

    public Tree(Tree left, Tree right, Object obj) {
        super();
        this.left = left;
        this.right = right;
        this.obj = obj;
    }
    public Tree(Object obj) {
        this(null, null, obj);
    }
    public Tree() {
        super();
    }


    /**
     * 構建一個二叉樹
     * @param objs
     */
    public void createTree(Object[] objs){
        datas=new ArrayList<Tree>();
        for (Object obj : objs) {
            datas.add(new Tree(obj));
        }
        root=datas.get(0);//將0作為根節點
        for (int i = 0; i < objs.length/2; i++) {
            datas.get(i).left=datas.get(i*2+1);
            if(i*2+2<datas.size()){
                datas.get(i).right=datas.get(i*2+2);
            }
        }
    }

    //先序遍歷
    public void preorder(Tree root){
        if(root!=null){
            log(root.getData());
            preorder(root.left);
            preorder(root.right);
        }

    }
    //中序遍歷
    public void inorder(Tree root){
        if(root!=null){
            inorder(root.left);
            log(root.getData());
            inorder(root.right);
        }

    }
    //後序遍歷
    public void postorder(Tree root){
        if(root!=null){
            postorder(root.left);
            postorder(root.right);
            log(root.getData());
        }

    }
    private void log(Object obj) {
        System.out.print(obj+" ");
    }
    public Object getData() {
        return obj;
    }
    public Tree getRoot() {
        return root;
    }

}

複製程式碼
2、測試程式碼:
    Tree tree = new Tree();
    Object[] obj = {1,2,3,4,5,6};
    tree.createTree(obj);
    
    tree.preorder(tree.getRoot());
    System.out.println("\n");
    tree.inorder(tree.getRoot());
    System.out.println("\n");
    tree.postorder(tree.getRoot());
複製程式碼
3、測試結果:

Markdown

本篇文章就到這了,有哪裡不對的請各位指點。

炮友們有問題,請留言 感謝! 這是粉絲QQ群

壓縮演算法從入門到放棄之二叉樹(1)

相關文章