数据结构-树、二叉树、哈夫曼树回顾

156 阅读4分钟

1.什么是树?

 树是具有一对多关系的数据结构,像树倒过来一样,有一个根,多个分支。用数据结构来描述的话,就是n个节点构成的具有层次关系的有限集合。

2.树的相关概念

 节点:书中的每一个数据元素都是节点

 节点的度:节点的子树个数

 树的度:树中所有节点最大的度

 叶子节点:度为0的节点,就是没有分支的节点。

 节点的层次(也成为树的深度🌲):树的根开始,所在的层为第一层,以此类推

3.树的特点?

 子树不相交

 除了根节点之外,每个节点都有且只有一个父节点,也叫双亲节点。

一个有N个节点的树,有N-1条边线连接

4:二叉树:

什么是二叉树?

 二叉树(Binary Tree)是n(n >= 0)个节点的有限集合,该集合或者空集(称为空二叉树),或者有一个根节点和两颗互不相交的,

 分别称为根节点的左子树和右子树的二叉树组成。

 二叉树的特点?

 1.每个节点最多两个字树

 2.左子树和右子树有顺序

 特殊二叉树:

 1.斜树

 所有节点只有左节点的叫左斜树,所有节点只有右节点的叫右斜树

 2.满二叉树

 二叉树中除了叶子节点,每个节点的度都为2,则此二叉树为满二叉树。

 3.完全二叉树

 二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树

        A

        B       C

    D     E   F     G

H

前序遍历:

当前节点 -> 左子树 -> 右子树

A->B->D->H-E->C->F->G

中序遍历

左子树->当前节点->右子树

H->D->B->E->A-F-C-G

后序遍历

左子树->右子树->当前节点

 H->D->E->B-F->G-C-A

//前序遍历利用递归方法

    public static void pre(TreeNode cur) {

        if(cur == null) {

            return;

        }

        System.out.println("遍历得到的数据是" + cur.data);

        pre(cur.leftNode);

        pre(cur.rightNode);

    }
    
    /**

     * 中序遍历

     * @param cur

     */

    public static void premid(TreeNode cur) {

        if(cur == null) {

            return;

        }

        premid(cur.getLeftNode());

        System.out.println(cur.getData());

        premid(cur.getRightNode());

    }

    /**

     * 后序遍历

     * @param cur

     */

    public static void preafter(TreeNode cur) {

        if(cur == null) {

            return;

        }

        preafter(cur.getLeftNode());

        preafter(cur.getRightNode());

        System.out.println(cur.getData());

    }

    public static void main(String[] args) {

        TreeNode a = new TreeNode("A");

        TreeNode b = new TreeNode("B");

        TreeNode c = new TreeNode("C");

        TreeNode d = new TreeNode("D");

        TreeNode e = new TreeNode("E");

        TreeNode f = new TreeNode("F");

        TreeNode g = new TreeNode("G");

        TreeNode h = new TreeNode("H");

        a.setLeftNode(b);

        a.setRightNode(c);

        b.setLeftNode(d);

        b.setRightNode(e);

        c.setLeftNode(f);

        c.setRightNode(g);

        d.setLeftNode(h);
        //前序遍历
        pre(a);
        //中序遍历
        premid(a);
        //后序遍历
        preafter(a);

    }

问题1: 前序遍历为:ABCDEF。中序遍历为CBAEDF。    后续的遍历为? CBEFDA

问题2: 中序遍历为ABCDEFG 后序遍历为BDCAFGE。 前序遍历为???  EACBDGF

二叉树建立:

在内存中,将二叉树的每个节点的空指针引出一个虚节点指向“#”,成为二叉树的扩展二叉树, AB#D##C##

哈夫曼树:

又名最优二叉树

哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。

带权路径是什么?  带权,个人理解就是比重。可以理解为该条路径占所有路径的百分比

路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1

结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积

树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树

WPL最小的二叉树就是赫夫曼树