树与森林总结(不包含二叉树)——legend
来源:互联网 发布:java子类继承父类实例 编辑:程序博客网 时间:2024/05/22 13:24
树与森林:
(一)树的存储结构:
(1)父指针:
1.用一个一维数组存储树中的每一个节点,每一个节点包含data,parent,parent指出该节点的父节点在数组中的位置。
2.类型定义如下;
typedef struct ParNode{
DataType data;
int parent;
};
typedef struct PTree{
ParNode tnode[Maxsize];
int currentSize;//当前的节点个数
};
3.示例图如下:
4.优缺点:
查找某个节点的父节点容易 ,查找孩子节点需遍历所有节点。
可以采取层次遍历。
(2)标准链表/M叉树表示法:
1,思想:
每一个节点由两部分组成,data,以及孩子指针数组pchilds[M],M为树的度。
2.类型定义如下:
typedef struct CTNode{
DataType data;
CTNode* pchilds[M];
};
缺点:由于很多节点的度没有达到M,所以会有很多的空指针。
(3)孩子链表:
1.思想:
为每一个节点都设置一个带有头节点的子女链表,数组中的每一个元素包含2个字段,data,以及带有头节点的子女链表的头指针。
2.示例如下图:
(4)孩子-兄弟链表:
1.思想:
每一个节点多有三个字段,data,lchild,rsibling,lchild为该节点的第一个孩子指针,rsibling为该节点的兄弟链表。
2.类型定义如下:
typedef struct CSNode{
DataType data;
CSNode * lchild;
CSNode* rsibling;
};
3.示例如下图:
(二)二叉树与树的差别:
二叉树与树的相互转化中,就是利用的是树的孩子-兄弟表示法,孩子-兄弟表示法中有两个指针域,跟二叉树类型。
(三)树,森林 转化为二叉树 :
(1)示例图如下:
(2)树转化为二叉树思想:
1.利用树的孩子-兄弟表示法;
2.由于根节点没有兄弟,所以树转化为二叉树后,二叉树的根节点一定没有右孩子。
3.步骤:
1)所欲相邻的兄弟节点之间加上一条水平连线。
2)对于非叶子节点node来说,除了最左边的孩子节点外,删除node与其他孩子节点之间的连线。
3)所有的水平线段以左边节点为轴顺时针旋转45度。
(3)森林转化为二叉树:
将每棵树用二叉树表示后,其他树的根节点为第一棵树的兄弟节点,即右孩子。
(四)二叉树转化为树或森林 :
(1)思想:
二叉树的根节点及其左子树可以看出第一棵树,二叉树的根节点的右孩子及其左子树看成第二颗树。
。。。。重复,直到产生一棵没有右孩子的二叉树为止,就构成了森林。
(2)示例图如下:
(五)并查集UFS(union-find set):
http://blog.csdn.net/legend050709/article/details/38920657
- 树与森林总结(不包含二叉树)——legend
- 树的总结(二叉树,树,森林)-legend
- 数据结构 — 树 与 二叉树、森林
- 数据结构——二叉树与树、森林的互换
- 树、森林与二叉树
- 树、森林与二叉树的转换总结
- 树、森林与二叉树的转换总结
- 二叉树的遍历(前中后,层次)——legend
- 二叉树与树以及森林谁包含元素个数更多
- 数据结构—树、森林与二叉树的转换(类C语言描述)
- 树,二叉树,森林各种遍历总结:
- 关于二叉树与树(森林)的知识点详解
- 树、森林与二叉树的转换
- 树 森林 与二叉树的转换
- 树、森林与二叉树的转换
- 树、森林与二叉树的转换
- 树、森林与二叉树的转换
- 树、森林与二叉树的转换
- 内存卡的相片变成一个USBC文件怎么办?
- 两个有序链表合并
- ios学习笔记之block在ios开发中的应用
- 关于微博服务端API的OAuth认证实现
- Android优秀开源APP
- 树与森林总结(不包含二叉树)——legend
- Python笔记3——函数
- Android:Activity的Task相关
- mySql远程登录的用户赋予权限
- 浮点数的大小比较
- 前台传值到后台,然后再返回给前台
- 花生壳动态域名教程
- android ScrollView高度
- div自动换行word-break:break-all和word-wrap:break-word的区别