作者: 玄夜 時間: 2018.6.30
前言
演算法,永不過時!
幹碼農幹了好幾年了,感覺自己能拿出手的東西並不多啊,所以最近有了重新拾起演算法這塊的想法;
進入正題,這是一個壓縮演算法系列的文章,從最簡單的二叉樹開始寫,敬請關注。
一、二叉樹的簡介
二叉樹是資料結構中樹家族最為基礎的結構。
1、二叉樹應用場景:
①、哈夫曼編碼,簡單有效的壓縮演算法
②、快速排序、查詢
2、二叉樹的特性:
①、二叉樹的每個結點至多隻有二棵子樹;
②、二叉樹的子樹有左右之分,次序不能顛倒;
③、二叉樹的第i層至多有2i-1個結點;深度為k的二叉樹至多有2k-1個結點。
3、二叉樹的基本形態:
二叉樹是遞迴定義的,其結點有左右子樹之分:
①空二叉樹——如圖(a);
②只有一個根結點的二叉樹——如圖(b);
③只有左子樹——如圖(c);
④只有右子樹——如圖(d);
⑤完全二叉樹——如圖(e)。
4.二叉樹的表達方法:
①、影象表達法,如圖:
②、符號表達法:
以上圖為例(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、測試結果:
本篇文章就到這了,有哪裡不對的請各位指點。