压缩算法从入门到放弃之二叉树(1)

做者: 玄夜 时间: 2018.6.30java


前言

算法,永不过期!

干码农干了好几年了,感受本身能拿出手的东西并很少啊,因此最近有了从新拾起算法这块的想法;算法

进入正题,这是一个压缩算法系列的文章,从最简单的二叉树开始写,敬请关注。bash


1、二叉树的简介

二叉树是数据结构中树家族最为基础的结构。数据结构

一、二叉树应用场景:

①、哈夫曼编码,简单有效的压缩算法post

②、快速排序、查找测试

二、二叉树的特性:

①、二叉树的每一个结点至多只有二棵子树;ui

②、二叉树的子树有左右之分,次序不能颠倒;this

③、二叉树的第i层至多有2i-1个结点;深度为k的二叉树至多有2k-1个结点。编码

三、二叉树的基本形态:

二叉树是递归定义的,其结点有左右子树之分:spa

Markdown

①空二叉树——如图(a);

②只有一个根结点的二叉树——如图(b);

③只有左子树——如图(c);

④只有右子树——如图(d);

⑤彻底二叉树——如图(e)。

4.二叉树的表达方法:

①、图像表达法,如图:

Markdown

②、符号表达法:

以上图为例(A,(B(D,E),C(F))

③、遍历表达法:

先序遍历为ABDECF

中序遍历为DBEAFC

后序遍历为DEBFCA


2、实战

好了,上面写的都是一些基本的知识点,如今直接上代码,简单粗暴:

一、先建一个类
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());
复制代码
三、测试结果:

Markdown

本篇文章就到这了,有哪里不对的请各位指点。

炮友们有问题,请留言 感谢! 这是粉丝QQ群

相关文章
相关标签/搜索