树
树 是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; }