树、森林
树的存储结构
双亲表示法(顺序 存储)
每个节点中保存指向双亲的指针
#define MAX_TREE_SIZE 100 //树中最多的节点数
//树的结点定义
typedef struct {
ElemType data; //数据元素
int parent; //双亲位置域
}PTNode;
//树的类型定义
typedef struct{
PTNode nodes[MAX_TREE_SIZE]; //双亲表示
int n; //结点数
}PTree;
孩子表示法(顺序存储+链式存储)
struct CTNode{
int child; //孩子结点在数组中的位置
struct CTNode *next; //下一个孩子
};
typedef struct {
ElemType data;
struct CTNode *firstChild; //第一个孩子
}CTBox;
typedef struct {
CTBox nodes[[MAX_TREE_SIZE];
int n,r; //结点数和根的位置
}CTree;
孩子兄弟表示法(二叉树表示法–链式)
typedef struct CSNode{
ElemType data; //数据域
struct CSNode *firstchild,*nextsibling; //第一个孩子和右兄弟指针
}CSNode,*CSTree;
树、森林的遍历
树的遍历
先根遍历(深度优先遍历)
方式:若树非空,先访问根结点,再依次对每颗子树进行先根遍历
void PreOrder(TreeNode *R){
if(R!=NULL){
visit(R); //访问根结点
while(R还有下一颗子树T){
PreOrder(T); //先根遍历下一棵子树
}
}
}
结论:对树的先根遍历与将该树转化为二叉树进行先序遍历一样
后根遍历(深度优先遍历)
方式:若树非空,先依次对每颗子树进行后根遍历,最后再访问根结点
void PostOrder(TreeNode *R){
if(R!=NULL){
while(R还有下一个子树T){
PostOrder(T);
}
visit(R); //访问根结点
}
}
结论:对树的后根遍历与将该树转化为二叉树进行中序遍历一样
层次遍历(广度优先遍历)
队列实现,与二叉树的层次遍历一致
森林的遍历
先序遍历
森林是m(m>0)棵互不相交的树的集合。每棵树去掉根节点后,其余个子树又组成森林。
方式:
(1)若森林非空,访问森中第一颗树的根节点
(2)先序遍历第一颗树中根结点的子树森林。
(3)先序遍历除去第一棵树之后剩余的树构成的森林
结论:对森林的先序遍历与将该树转化为二叉树进行先序遍历一样
中序遍历
方式:
(1)中序遍历第一颗树中根结点的子树森林。
(2)访问第一颗树的根节点
(3)中序遍历除去第一棵树之后剩余的树构成的森林
结论:对森林的中序遍历与将该树转化为二叉树进行中序遍历一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3Ridlxo-1627293608272)(C:\Users\25720\AppData\Roaming\Typora\typora-user-images\image-20210723170258729.png)]
习题
1.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SO21pW0w-1627293608277)(C:\Users\25720\AppData\Roaming\Typora\typora-user-images\image-20210723175106931.png)]
2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VIftibMK-1627293608280)(C:\Users\25720\AppData\Roaming\Typora\typora-user-images\image-20210723180006731.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HoQ6KfxF-1627293608283)(C:\Users\25720\AppData\Roaming\Typora\typora-user-images\image-20210723180156325.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U9nw646u-1627293608286)(C:\Users\25720\AppData\Roaming\Typora\typora-user-images\image-20210723180346312.png)]