数据结构与算法笔记 lesson 18 树

树 

树 是n(n>=0)个结点的有限集。当n=0时成为空树。在任意一颗非空树中:

有且仅有一个特定的称为根的结点;

当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、.....Tm,其中每一个集合本身又是一颗树,并且称为根的子树

n>0时,根节点是唯一的,坚决不可能存在多个根结点

m>0 时,子树的个数是没有限制的,但它们互相是一定不会相交的。

结点拥有的子树称为结点的度(Degree),树的度取树内各结点的度的最大值。

度为0的结点称为叶结点(Leaf)或终端结点;

度不为0的结点称为分支结点或非终端结点,除根结点外,分支结点也称为内部结点

 树的存储结构

双亲表示法

以双亲作为索引的关键词

以一组连续空间存储树的结点,同时在每个结点中,附设一个指示双亲结点在数组中位置的元素

#define MAX_TREE_SIZE
typedef  int ElemType;
typedef struct PTNode
{
  ElemType data ; //结点数据
  int  parent
}PTNode;

typedef struct
{
   PTNode nodes(MAX_TREE_SIZE);
   int  r ;  //根的位置
   int n ; //结点数目 
}PTree;


这样的存储结构没我们可以根据某结点的parent指针找到它的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的根。

但是要知道某结点的子节点,只能遍历整个树结构。

双亲孩子表示法

#define MAX_TREE_SIZE 100
typedef char  ElemType;
// 孩子结点
typedef struct CTNode
{
   int child;   //孩子结点的下标
   struct CTNode *next ;  //指向下一个孩子结点的指针
} *ChildPtr;

//表头结构
typedef struct
{
  ElemType data;       // 存放在树中的结点的数据
  int parent;                 // 存放双亲的下标
  ChildPtr firstchild;  //  指向第一个孩子的指针
}CTBox;

//树结构
typedef struct 
{
   CTBox nodes[MAX_TREE_SIZE];    //结点数组
   int  r ,n;
}



你可能感兴趣的:(数据结构,算法学习笔记)