数据结构:树

1.树定义

  专业定义:

    1.有且只有一个称为根的结点

    2.有若干个互不相关的子树,这些子树本身也是一棵树

  通俗定义

    1.树是由结点和边组成

    2.每一个结点只有一个父节点,但可以有多个子节点

    3.但有一个结点例外,该节点没有父节点,此结点称为根结点

  专业术语

    结点  父节点  子节点  子孙  堂兄弟

    深度:

      从根结点到最底层结点的层数称之为深度

      根结点是第一层

    叶子结点:

      没有子结点的结点

    非终端结点:

      实际就是非叶子结点

    度:

      子结点的个数称为度

2.树分类

  一般树

    任意一个结点的子结点的个数都不受限制

  二叉树

    任意一个结点的子结点个数最多两个,且子结点的位置不可更改(序号)

    分类:

      一般二叉树

      满二叉树

        在不增加树的层数的前提下,无法添加一个结点的二叉树就是满二叉树

        一个结点的二叉树就是满二叉树

      完全二叉树(必须是满的然后再砍)

        如果只是删除了满二叉树最底层最右边的连续若干个结点

        这样形成的二叉树就是完全二叉树

        (满二叉树是完全二叉树的特例,就是一个不删)

      森林

        n个互不相交的树的集合

 

  红的是一般二叉树

  蓝的是补充为 满二叉树

  黄色的是砍除部分,称为完全二叉树

3.树的存储

  (1)二叉树的存储

    连续存储【完全二叉树】(根据序号和算法等)

       优点:

        查找某个结点的父结点和子结点(也包括判断有没有子节点)速度很快

      缺点:  

        耗用内存空间过大

    链式存储(根据指针域指向来存储)

 

  (2)一般树的存储

    双亲表示法

      求父节点方便

      (通过结构体数组或类来存储子节点数据以及父节点的下标)

    孩子表示法

      求子节点方便

      (通过链表来存储子节点)

    双亲孩子表示法

      求父节点和子节点都很方便

      (结合前两种,操作比较复杂)

    二叉树表示法

       把一个普通树转化成二叉树来存储

       具体转换方法:

          设法保证任意一个结点的

            左指针域指向第一个孩子

            右指针域指向它的兄弟

       只要满足就可以把一个普通树转化成二叉树 

          一个普通树转化成二叉树一定没有右子树

          

  (3)森林的存储

    类似于一般树的二叉树表示法

 

  

4.二叉树操作

  遍历

    先序遍历【先访问根结点】

      先访问根结点

      再先序访问左子树

      再先序访问右子树

    中序遍历【中间访问根结点】

      中序遍历左子树

      再访问根结点

      再中序遍历右子树

    后序遍历【最后访问根结点】

      中序遍历左子树

      中序遍历右子树

      再访问根结点 

  已知两种遍历序列求原始二叉树

      通过先序和中序,或者中序和后序可以还原出原始二叉树

      但是通过先序和后序无法还原出原始的二叉树

      先序和中序:通过先序第一个来判断根结点,之后找到中序的那个根结点后,截断左

            边,再找先序中根结点后下一个字母,截断该字母左和右

      中序和后序:通过后序第一个来判断根结点,操作与先序只是从后开始的区别

5.应用

  树是数据库中数据组织的一种重要形式

  操作系统子父系统的关系本身就是一棵树

  面向对象语言中类的继承关系

 

  赫夫曼树

   (1)术语

    结点的路径长度:从根结点到该结点的路径上的连接数

    树的路径长度:树中每个叶子结点的路径长度之和

    结点带权路径长度:结点的路径长度与结点权值的累加

    树的带权路径长度:WPL 树的所有叶子结点的带权路径长度之和

   (2)举例

    

 

             左边                    右边

    结点的路径长度: A:1 B:2 C:3 D:3                A:3 B:3 C:2 D:1

    树的路径长度:  1+2+3+3=9                 1+2+3+3=9

    结点带权路径长度:A:1*5=5 B:2*15=30 C:3*70=210   D:3*10=30        A:15 B:45 C:140   D:10

    树的带权路径长度:275                    210

    左边的WLP大于右边,所以右边效率更好(WLP越小二叉树性能越高效)

 

posted on 2019-06-04 12:28  zhaoy_shine  阅读(338)  评论(0编辑  收藏  举报

导航