树和森林
1、树和森林
(1)树是n(n>=0)个结点的有限集。
①若n=0,称为空树;
②若n>0,则:
- 有且仅有一个特定的称为根的结点;
- 其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3,……,Tm。
2、树
(1)树的存储结构——双亲表示法
①基本知识
- 实现:定义结构数据,存放树的结点,每个结点含两个域。
- 数据域:存放结点本身信息。
- 双亲域:指示本结点的双亲结点在数组中的位置。
特点:找双亲容易,找孩子难。
上图中r表示根结点的下标,n表示数组的大小。
②算法描述
typedef struct PTNode{
TElemType date;
int parent;//双亲位置域
}PTNode;
//树的结构
#define MAXSIZE 100
typedef struct{
PTNode nodes[MAXSIZE];
int r,n;//根结点的位置和结点个数
}PTree;
(2)树的存储结构——孩子链表
①基本知识
把每个结点的孩子结点排起来,看成是一个线性表,用单链表存储,则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,用顺序表(含n个元素的结构数组)存储。
特点:找孩子容易,找双亲难。
②算法描述
特点:找孩子容易,找双亲难。
②算法描述
typedef struct CTNode{
int child;
struct CTNode* next;
}*ChildPtr;
typedef struct{
TElemType date;
ChildPtr firstchild;
}CTBox;
(3)树的存储结构——孩子兄弟表示法
(二叉树表示法、二叉链表表示法)
①实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点。
②算法实现
typedef struct CSNode{
ElemType date;
struct CSNode *firstchild,*nextsibling;//firstchild为第一个孩子;nextsibling为下一个兄弟结点
}
③孩子兄弟表示法图示
(4)树转化为二叉树
①基本知识
- 将树转化为二叉树进行处理,利用二叉树的算法来实现对树的操作。
- 由于树和二叉树都可以用二叉链表作存储结构,则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系。
②图示
树:结点的左指针指向其第一个孩子,右指针指向其兄弟;
二叉树:结点的左指针指向其左孩子,右指针指向其右孩子。
树转化为二叉树:二叉树指向左孩子的指针与其指向第一个孩子的指针相对应,指向右孩子的指针与其指向兄弟的指针相对应。(即右孩子为其兄弟,左孩子为其第一个)
③树转化为二叉树的步骤 - 加线:在兄弟之间加一条线。
- 抹线:对每个结点,除了其左孩子外,去掉其与其余孩子之间的关系。
- 旋转:以树的根结点为轴心,将整树顺时针转45度。
树变二叉树:兄弟相连留长子。
④例如:
(5)二叉树转化为树
①步骤:
- 加线:若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子……沿分支找到的所有右孩子,都与p的双亲用线连起来。
- 抹线:抹掉原二叉树中双亲与右孩子之间的连线。
- 调整:将结点按层次排列,形成树结构。
二叉树变树:左孩右右连双亲,去掉原来右孩线。
②例如:
(6)树的遍历
三种方式:
- 先根遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
- 后根遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
- 按层次遍历:若树不空,则自上而下自左至右访问树中每个结点。
注意:树中没有中序遍历。
3、森林
(1)森林转换为二叉树(二叉树与多棵树之间的关系)
①步骤:
- 将各棵树分别转换成二叉树。
- 将每棵树的根结点用线相连。
- 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构。
森林变二叉树:树变二叉根相连。
②例如:
(2)二叉树转换为森林
步骤:
- 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部末抹掉,使之变成孤立的二叉树。
- 还原:将孤立的二叉树还原成树。
二叉树变森林:去掉全部右孩线,孤立二叉再还原。
注意:孩子在左兄弟在右。
(3)森林的遍历
①将森林看成由三部分构成:
- 森林中第一棵树的根结点;
- 森林中第一棵树的子树森林;
- 森林中其他树构成的森林。
②先序遍历
若森林不为空,则: - 访问森林中第一棵树的根结点;
- 先序遍历森林中第一棵树的子树森林;
- 先序遍历森林中(除第一棵树之外)其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行先根遍历。
③中序遍历
若森林不空,则: - 中序遍历森林中第一棵树的子树森林;
- 访问森林中第一棵树的根结点;
- 中序遍历森林中(除第一棵树之外)其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行后根遍历。