数据结构与算法(13)

1、树和森林

树的储存结构:

1)双亲表示法


这种表示方法中,以一组连续的存储单元存储树的节点,每个节点除了数据域data外,还附设一个parent域用以指示其双亲节点的位置。

这种存储结构利用了每个节点(除根以外)只有唯一的双亲的性质。在这种存储结构下,求节点的双亲十分方便,求树的根也很容易,但求节点的孩子时需要遍历整个结构。

2)孩子表示法


由于树中每个节点可能有多棵子树,则可用多重链表,即每个节点有多个指针域,其中每个指针指向一棵子树的根节点,
把每个节点的孩子节点排列起来,看成一个线性表,且以单链表作为存储结构,则n个节点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,为了便于查找,可采用顺序存储结构。
与双亲表示法相反,孩子表示法便于那些涉及孩子的操作的实现。可以把双亲表示法和孩子表示法结合起来,即将双亲表示和孩子链表合在一起。

3) 孩子兄弟表示法

孩子兄弟表示法又称二叉树表示法,或二叉链表表示法,即以二叉链表作为树的存储结构。链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点,分别命名为firstchild域和nextsibling域。

typedef struct CSNode
{
    ElemType data;
    struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;

利用这种存储结构便于实现各种树的操作。首先易于实现找节点孩子等操作。例如,若要访问节点x的第i个孩子,则只要先从firstchild域找到第1个孩子节点,然后沿着孩子节点的nextsibling域连续走i-1步,便可找到x的第i个孩子。当然,如果为每个节点增设一个parent域,则同样能方便地实现查找双亲的操作。
这种存储结构的优点是它和二叉树的二叉链表表示完全一样,便于将一般的树结构转换为二叉树进行处理,利用二叉树的算法来实现对树的操作。因此孩子兄弟表示法是应用较为普遍的一种树的存储表示方法。

2、树、森林、二叉树的转换

将树转换为二叉树

1)树中所有相邻兄弟结点连线。

2)对于树中的每一个节点,只保留它与自己第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线。

3)以树的根结点为轴心,将整棵树顺时针转动一定的角度。

在树所转化成的二叉树中,左分支的各结点在原来的树中是父子关系,右分支是原来树中的兄弟结点。由于根节点没有兄弟,所以转化后的二叉树的根一定没有右结点。

森林转换为二叉树

1)依次将森林中的树转化为二叉树。

2)从第二棵二叉树开始,依次把当前二叉树作为前一棵二叉树的根节点的右子树连接。

二叉树转换为森林

1)若一个结点是其双亲的右孩子,则把从该结点沿右分支所找到的所有结点和它的双亲连接起来。

2)删除二叉树中所有结点与其右子树的连线。

3)整理得到树或者森林

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值