树与森林总结(不包含二叉树)——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

0 0
原创粉丝点击