做者: 玄夜 時間: 2018.6.30java
幹碼農幹了好幾年了,感受本身能拿出手的東西並很少啊,因此最近有了從新拾起算法這塊的想法;算法
進入正題,這是一個壓縮算法系列的文章,從最簡單的二叉樹開始寫,敬請關注。bash
二叉樹是數據結構中樹家族最爲基礎的結構。數據結構
①、哈夫曼編碼,簡單有效的壓縮算法post
②、快速排序、查找測試
①、二叉樹的每一個結點至多隻有二棵子樹;ui
②、二叉樹的子樹有左右之分,次序不能顛倒;this
③、二叉樹的第i層至多有2i-1個結點;深度爲k的二叉樹至多有2k-1個結點。編碼
二叉樹是遞歸定義的,其結點有左右子樹之分:spa
①空二叉樹——如圖(a);
②只有一個根結點的二叉樹——如圖(b);
③只有左子樹——如圖(c);
④只有右子樹——如圖(d);
⑤徹底二叉樹——如圖(e)。
①、圖像表達法,如圖:
②、符號表達法:
以上圖爲例(A,(B(D,E),C(F))
③、遍歷表達法:
先序遍歷爲ABDECF
中序遍歷爲DBEAFC
後序遍歷爲DEBFCA
好了,上面寫的都是一些基本的知識點,如今直接上代碼,簡單粗暴:
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;
}
}
複製代碼
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());
複製代碼
本篇文章就到這了,有哪裏不對的請各位指點。