数据结构(六)树----树、森林与二叉树的转换及树的存储结构

来源:互联网 发布:黑马程序员html5视频 编辑:程序博客网 时间:2024/05/17 21:50
  

树:

       树、森林与二叉树的转换:

              树转换为二叉树:

1)  在所有兄弟结点之间连线;

2)  对每一结点与所有孩子结点的连线中,只保留与左孩子结点间的连线,与其它孩子之间的连线都去掉。

由于树的根结点没有兄弟,这样以来,每一棵树转换为二叉树后,根结点的右子树必为空。

森林转换为二叉树:

1)  先将森林中的每一棵树转换为二叉树;

2)  再将这些二叉树的根结点从左到右连在一起就构成了一棵新的二叉树。

二叉树转换为森林:

如果结点X是其双亲结点Y的左孩子,将所有X的右孩子、右孩子的右孩子、…..都与双亲结点Y相连,然后现去掉这些孩子结点与其双亲结点间的连线,就得到转换后的森林。

       存储结构:

              树常用的存储结构有:

                     1.双亲链表表示法

                     2.孩子链表表示法

                     3.孩子兄弟链表表示法

                     下面一一介绍:

1.  双亲链表:

链表的结点由该结点的指向双亲结点指针和它的数据组成。每个结点的双亲结点是唯一的。

#define MAXTREESIZE        10

typedef int datatype;

                            //双亲链表结点类型定义

typedef struct

{

datatype Data; //结点的数据

int parent;       //指向双亲结点的指针。根结点没有双亲,所以根结点//的双亲结点指针值为-1,根结点的孩子结点的双亲结//点指针为0,依次往下推

}pTreeNode;

                            //双亲链表类型定义

typedef struct

                            {

                                   pTreeNode node[MAXTREESIZE];

                                   int n;

                            }pTree;  

                            pTree T;//双亲链表

该链表用向量表示,也可以用动态链表表示,不过前者更方便些。

该存储结构适用于向上访问求指定结点的双亲或祖先,不适于向下访问求指定结点的后代。

2.  孩子链表

为了节省空间,不按树的度来设置树的结点指针个数(可节省kn-(n-1)个结点指针);为了便于运算,不按结点的度来设置树的结点指针个数。那采用什么方法来设置树的结点的指针数呢?就用孩子链表表示法。也就是为每个结点设置一个孩子链表,然后把每个结点及其孩子链表的头指针放在一个向量表里。

#define MAXTREESIZE        10

typedef int datatype;

                            //孩子链表结点类型定义

typedef struct

{

int chile;         //孩子结点在链表中对应的序号

struct CNode *next;      //兄弟结点指针

}CNode;

                            //孩子链表结点类型定义

typedef struct

                            {

                                   pTreeNode node[MAXTREESIZE];

                                   int n;

                                   datatype Data;//结点数据

                                   CNode *firstChild;//孩子链表的头指针

                            }cTreeNode;

                            typedef struct

{
       cTreeNode nodes[MAXTREESIZE];

       int n,root;//结点数,根在向量中的位置(0)

}CTree;

                            CTree T;//双亲链表

该存储结构适用于向下访问求指定结点的后代,不适于向上访问求指定结点的双亲或祖先。

3.  孩子兄弟链表

结点由指向它的左孩子的指针、它的数据和指向它右兄弟的指针(也就是它右兄弟链表的头指针)组成。

原创粉丝点击