3.树——二叉树

Posted zhousya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.树——二叉树相关的知识,希望对你有一定的参考价值。

1. 什么是树

  [1] 树是由节点和边组成,有且仅有一个节点成为根节点;

  [2] 树中有若干个不相交的子树,每个子树本身也是一棵树;

  [3] 除根节点以外,树中每个节点只有一个父节点,但可以有多个子节点;

  [4] 空集合也是树,即为空树,空树中没有结点;

2. 树的组成

  [1] 结点的度:一个结点含有的子结点的个数;   eg:结点2的度为2

  [2] 树的度:一棵树中,最大的结点的度;    eg:树的度为2

  [3] 根结点:所有节点的祖先,没有父亲的结点; eg:结点1

  [4] 父结点:含有子结点的结点;        eg:结点2是结点4,5的父节点

  [5] 子结点:度为0的结点;           eg:结点4,5是结点2的子节点

  [6] 子孙结点:以某结点为根的子树中任一结点; eg:结点2,3 … 10是结点1的子孙结点

  [7] 堂兄弟结点:双亲在同一层的结点;      eg:结点4和6互为堂兄弟结点;

  [8] 叶子结点:(终端结点)度为0的结点;    eg:结点8,9,10为叶子结点;

  [9] 深度:树中结点的最大层次;        eg:该树的深度为4;

技术图片

图1. 树的组成

 3. 树的分类

  [1] 一般树:任意一个节点的子节点的个数都不受限制;

  [2] 二叉树:

         一般二叉树:每个节点最多含有两个子树;

         满二叉树:除了叶子结点之外的每个结点都有两个孩子结点,每一层都被完全填充;

         完全二叉树:除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左看齐;(见图1)

  [3] 森林:由m棵互不相交的树的集合(m>=0);

4. 树的存储

  [1] 二叉树的存储:

  顺序存储——数组

        优点:查找某个节点的父节点和子节点(也包括有没有子节点)速度很快;

        缺点:耗用内存空间过大;

       存储结构:typedef  ElemType  BTree[MaxSize];

        举例说明: 

技术图片

图2. 二叉树 

技术图片

  链式存储——链表

        优点:耗用内存空间小

        缺点:查找父节点不方便

        节点结构:typedef struct node{
                ElemType data;
                struct node lchild,rchild;
               }

  [2] 一般树的存储

技术图片

图3. 一般树

 

     ① 双亲表示法:取一块连续的内存空间,在存储每个结点的同时,各自都附加一个记录其父结点位置的变量。——求父结点方便,不方便求子结点;

    数组存储: 

技术图片

    ② 孩子表示法:将树中的每个结点的孩子结点排列成一个线性表,用链表存储起来。对于含有 n 个结点的树来说,就会有 n 个单链表,将 n 个单链表的头指针存储在一个线性表中——适合找孩子结点;

    链表存储:

技术图片

 图4. 孩子表示法

 

     ③ 双亲孩子表示法:结合双亲表示法和孩子表示法。

技术图片

图5. 双亲孩子表示法

    ④ 二叉树表示法:由孩子指针域、数据域和兄弟指针域组成,其中孩子指针域,表示指向当前结点的第一个孩子结点,兄弟结点表示指向当前结点的下一个兄弟结点。

技术图片

 

图6. 二叉树表示法

 

   [3] 森林的存储

     二叉树表示法:

 技术图片

 

图7. 初始森林

 

 技术图片

 

图8. 将森林中的每棵子树变为二叉树

 

 技术图片

 

图9. 合并每一棵二叉树

 

 5. 二叉树的遍历

技术图片

 

 

 图10. 二叉树

  [1] 先序遍历: (根左右) ABDGEHCFI

  [2] 中序遍历:  (左根右)  GDBHEAFIC

  [3] 后序遍历:  (左右根)  GDHEBIFCA    

  [4] 已知两种遍历序列求原始二叉树:

      (1)先序,中序和后序三种遍历中,只知道其中任意一个是无法还原原始的树结构。

      (2)通过先序和中序 或者 中序和后序 两种方式可以还原原始的二叉树。但是通过先序和后序是无法还原的。

6. 树的应用  

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

  [2] 操作系统父子进程的关系本身就是一棵树

  [3] 面向对象语言中类的继承关系本身就是一棵树

  [4] 赫夫曼树

 

备注:学习过程中难免会出现很多错误,请大家指教!有问题可以直接评论我,谢谢!

以上是关于3.树——二叉树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 二叉树

算法与数据结构二叉树的顺序存储代码

数据结构与算法:树 顺序存储二叉树

C语言数据结构“遍历二叉树”

数据结构与算法:树 二叉树入门

二叉树 P4913 深基16.例3二叉树深度