树的定义
树是 n(n>=0) 个结点的有限集(是一种一对多的数据结构)。当 n=0 时就是空树;
- 根节点有且只有一个
- 除根节点外的每个集合本身又是一棵树,称数根的子树(子树个数没有没有限制,并且他们互不相交)
- 结点的度:该节点拥有子树的数量
- 树的度:取树中各结点的度的最大值
- 叶子结点(终端结点):度为0的结点
- 分支结点:度不为0的结点;分支中出去根结点外的其余节点又称为内部结点
- 结点的层次:从根节点开始,根为第一层;根的孩子为第二层;...
- 树的高度/深度:树中结点的最大层数
树的存储结构
1、双亲表示法:假设以一组连续空间存储树的结点,同时在每个节点中附设一个指示器双亲的结点在数组中的位置元素
时间复杂度;查找双亲结点,O(1);查找子结点,O(n);
1 #define MAX_TREE_SIZE 20 2 typedef int ElemType; 3 4 typedef struct PTNpde{ 5 ElemType data;//结点数据 6 int parent;//双亲下标 7 }PTNode; 8 9 typedef struct{ 10 PTNode nodes[MAX_TREE_SIZE]; 11 int r;//根结点下标 12 int n;//节点数目 13 }PTree;
例如:

2、孩子表示法:由于树的每个结点可能有多颗树,可考虑用多重链表实现。
相比较双亲表示法,把数组中表示双亲的下标元素改为指向单链表的指针;单链表中存放子结点的下标。

3、双亲孩子表示法:将双亲表示法和孩子表示法结合在一起
1 #define MAX_TREE_SIZE 20 2 typedef int ElemType; 3 4 typedef struct CTNpde{//孩子结点 5 int child;//孩子结点的下标 6 CTNode *next;//指向下一个孩子节点(本节点的兄弟) 7 }* childPtr; 8 9 typedef struct{//表头结构 10 ElemType data; 11 int parent;//双亲下标 12 childPrt firstchild;//指向子节点链表的指针 13 }CTBox; 14 15 typedef struct{//树结构 16 CTBox nodes[MAX_TREE_SIZE]; 17 int r;//根结点下标 18 int n;//节点数目 19 }Tree;

浙公网安备 33010602011771号