做者: 玄夜 时间: 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());
复制代码
本篇文章就到这了,有哪里不对的请各位指点。