参考资料

《数据结构(c语言版)》

http://www.cnblogs.com/huangxincheng/archive/2012/07/21/2602375.html (系列文章)

http://www.cnblogs.com/sunysen/p/3201503.html(系列文章)

http://www.cnblogs.com/pengyingh/articles/2396466.html

http://www.cnblogs.com/sunysen/p/3225605.html

  1. 树的定义

      树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

    • 每个结点有零个或多个子结点;
    • 没有前驱的结点称为根结点;
    • 每一个非根结点有且只有一个父结点;
    • 除了根结点外,每个子结点可以分为m个不相交的子树;
  2. 基本术语
    节点的度一个节点含有的子树的个数称为该节点的度
    叶子:度为0的节点
    非终端节点或分支节点:度不为零的节点;
    树的度:树内所有节点的度的最大值;
    双亲节点或父节点:若一个结点含有子节点,则这个节点称为其子节点的父节点;
    孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
    兄弟节点:具有相同父节点的节点互称为兄弟节点;
    堂兄弟节点:双亲在同一层的节点互为堂兄弟;
    节点的祖先:从根到该节点所经分支上的所有节点;
    子孙:以某节点为根的子树中任一节点都称为该节点的子孙;
    节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
    树的高度或深度:树中节点的最大层次;
    森林:由m(m>=0)棵互不相交的树的集合称为森林;
    有序树/无序树:如果将树中节点的各个子树看成从左到右是有次序的,则称该树为有序树,否则为无序树;
  3. 树的分类
    图片来自维基百科。
  4. 二叉树
    每个节点至多只有两棵子树的有序树。
    满二叉树:节点数n=2^k-1其中k表示深度,也就是层数
    完全二叉树
    二叉树有如下性质:
    性质1:在二叉树的第i层上最多有2 i-1 个节点;
    性质2:二叉树中如果深度为k,那么最多有2k-1个节点;
    性质3:n0=n2+1  n0表示度数为0的节点 n2表示度数为2的节点
    性质4:在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]+1是向下取整
    性质5:如果有一颗有n个节点的完全二叉树的节点按层次序编号,对任一层的节点i(1<=i<=n)有

        1.如果i=1,则节点是二叉树的根,无双亲,如果i>1,则其双亲节点为[i/2],向下取整

        2.如果2i>n那么节点i没有左孩子,否则其左孩子为2i

        3.如果2i+1>n那么节点没有右孩子,否则右孩子为2i+1

  5. 二叉树存储结构

    1.顺序存储结构

        二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法从树根起,自上层至下层,每层自左至右地给所有结点编号,缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为k且只有k个结点的右单支树需要2k-1个结点存储空间。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。

    2.链式存储结构

        二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。

    通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:

      其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表。

  6. 二叉树的遍历
    三种:前序、中序、后序;
  7. 二叉树种类:
    线索二叉树、二叉查找树、二叉平衡树(AVL)。。。