14.0、C语言数据结构——树 (2)

14.0、C语言数据结构——树 (2)

双亲表示法:

言外之意就是以双亲作为索引的关键词的一种存储方式;

        我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点在数组中的位置的元素;

来看看代码实现过程->

#define MAX_TREE_SIZE 100

typedef int ElemType;

type struct PTNode {
    ElemType data;    //结点数据
    int parent;       //双亲位置
}PTNode;

typedef struct {
    PTNode nodes[MAX_TREE_SIZE];
    int r;    //根的位置    
    int n;    //结点数目
}PTree;

        这样的存储结构,我们可以根据某结点的 parent 指针找到他的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的根;

        存储结构的设计是一个非常灵活的过程,只要你愿意,你可以设计出任何你想要的奇葩存储结构~

        一个存储结构设计的是否合理,取决于基于该存储结构的运算是否合适、是否方便,时间复杂度好不好等等。

孩子表示法:

我们这次换个角度来考虑,由于树中每个结点可能有多棵子树,可以考虑用多重链表来实现;

        方案1 ->

        根据树的度(一棵树的度按照最多的子结点数来算),声明足够空间存放子树指针的结点:

缺点十分明显,就是造成了浪费;

那么针对方案1 的缺点我们制定了第二套方案->

        这样我们就克服了浪费这个缺点,但是每个结点的度的值不同,初始化和维护起来难度巨大,还是不可取;

为了同时解决上面两种方案的缺点,请看方案3,如下所示->

进过层层优化 得出既可以找到双亲又可以找到孩子的 -> 双亲孩子表示法

 接下来用代码实现一下->

#define MAX_TREE_SIZE 100

typedef char ElemType;

//孩子结点
typedef struct CTNode {
    int child;              //孩子结点的下标
    struct CTNode* next;    //指向下一个孩子结点的指针
} *ChlidPtr;

//表头结构
typedef struct {
    ElemType data;        //存放在树中的结点的数据    
    int parent;           //存放双亲的下标
    ChildPtr firstchild;  //指向第一个孩子的指针
} CTBox;

//树结构
typedef struct Tree{
    CTBox nodex[MAX_TREE_SIZE];    //结点数组
    int r;    //根结点的位置
    int n;    //结点数量
}Tree;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值