数据结构——树

1 树的定义

  树是一对多的数据结构,是n(n>0)个结点的有限集,当n=0时称为空树;在任一棵非空树中,有且仅有一个根结点,当n>1时,除根结点外的其余结点可分为m(m>0)棵互不相交的子树;

1.1 树的概念

  结点:包含数据元素及指向子树的指针;

  结点的度:结点拥有子树的个数;

  树的度:树中所有结点度的最大值;

  结点关系:

    双亲结点:树中结点A为B、C、D的双亲结点

    孩子结点:树中结点B、C、D为A的孩子结点

    兄弟结点:树中B、C、D互为兄弟结点

    

1.2 结点的分类

  根结点:没有双亲的结点

  内部结点:有双亲,且结点的度不为0的结点

  叶子结点:有双亲,且结点的度为0的几点

    

1.3 结点的层次

  结点的层次:

    第一层:根结点

    第二层:根结点的所有孩子结点

    以此类推

  树的深度:树中结点的最大层次数

  树的顺序:

    有序树:树中任意结点的子结点之间有顺序关系

    无序树:树中任意结点的子结点之间没有顺序关系,也称自由树;

  森林:m棵互补相交的树的集合

   

2 树的抽象数据类型

  ADT树:

    data:树是由一个根结点和若干棵子树构成,数据结点具有相同的数据类型及层次关系

operation
  initTree                 //构造树T
  destroyTree(T)      //销毁树T
  creatTree(T)         //创建树T
  clearTree(T)         //若树T存在,将树清成空树
  treeEmpty(T)       //若树T为空,返回true
                            //若树T不为空,返回false
  treeDepth(T)       //获取树T的深度
  root(T)               //返回树T的根结点
  value(T,e)          //返回树T的结点e中的数据
  assign(T,e,v)      //对树T的结点e中的数据赋值v
  parent(T,e)        //返回树T的结点e的父结点
  leftChild(T,e)      //返回树T的结点e的最左孩子结点
  rightSibling(T,e)   //返回树T的结点e的右兄弟结点
  insertChild(T,e,i,c)//在树T的结点e的度为i+1的位置添加子树c
  deleteChile(T,e,i)  //删除树T的结点e的度为i+1的位置的子树
endADT

3 树的顺序存储结构

3.1 双亲表示法

  在一组连续的存储空间中,存储树中的每个结点

  每个结点包含:数据元素、其双亲结点的位置

   

3.2 双亲表示法代码定义

   

#define TREESIZE 100
typedef int DataType

typedef struct TNode
{
  DataType data;
  int parent;
}TNode;

typedef struct Tree
{
  TNode nodes[TREESIZE];
  int root;
  int count;
}Tree;

3.3 双亲表示法扩展

3.3.1 带一个孩子结点的扩展

 

3.3.2 带所有孩子结点的扩展

 

4 树的链式存储结构

  在一组连续或者不连续的存储空间中,存储树中的每个结点

  每个结点包含:数据元素、其每个孩子结点的指针

   

4.1 代码定义

 

#define CHILDSIZE 3

typedef int DataType

typedef struct TNode
{
  DataType data;
  struct TNode *children[CHILDSIZE]; //指针数组
}TNode;

typedef struct Tree
{
  TNode *root;
  int count;
}Tree;

4.2 孩子表示法扩展

 

4.3 孩子表示法扩展

 

5 顺序、链式组合存储结构

  组合表示方法:

    将树中的所有结点放到一个数组中;

    每个结点的孩子由一个链表表示;

  

5.1 组合表示法代码定义

#define TREESIZE 100
typedef int DataType
typedef struct ChildNode
{
  int child;
  struct ChildNode *next;
}ChildNode;

typedef struct TreeNode
{
  DataType data;
  struct ChildNode *firstChild;
}TreeNode;

typedef struct Tree
{
  TreeNode nodes[TREESIZE];
  int root;
  int count;
}Tree;

5.2 组合表示法扩展

  将树中的所有结点放到一个数组中;

  每个结点的孩子由一个链表表示;

posted @ 2019-01-07 09:32  dongry  阅读(449)  评论(0编辑  收藏  举报