408-数据结构-树的存储结构

树的存储结构与二叉树不同,二叉树确定子代有,012个,树不确定,所以需要新的存储结构

双亲表示法

子代结点个数不确定,但是父结点确定只有一个。
双亲表示法通常使用顺序存储实现。可以理解为一个特殊结构体数组,结构体含有两块内容,第一块用于存储数据,第二块用于父结点在顺序存储中的下标。

typedef Struct {
	ElemType data;
	int parentIndex;
}parentTree;

添加结点:寻找到一个没有存放的,例如parent Index设置为-1的结点进行添加。
删除结点:删除结点不仅需要删除自己所占用的存储空间,还需要遍历释放子代的结点。
同时释放结点也有两种不同方式:

  1. 释放结点直接将parentIndex置为-1,表示该单元不存储树的结点。
  2. 将最后一个覆盖到需要删除的结点,然后将最后一个结点置空。通常采用这个方式。这样做有一个好处是在检索序列的时候能够保证检索个数为树的所有单元。

孩子表示法

表示所有孩子,可以通过链表进行表示。采用这种方式通常采用顺序存储与链式存储结合方式。
每一个结点开辟数据区域与指针,这几个结点直接采用顺序存储。而其中指针采用链表存储,每一个内容存放孩子结点地址与链表下一个地址。

孩子兄弟表示法

采用链式存储,每一个结点开辟两个指针,一个指针指向自己的孩子,另一个指针指向自己的兄弟。从单纯的物理结构来看,这个物理结构与二叉树的物理结构完全一致。不同点在于一个是左孩子与右孩子,一个是孩子与兄弟。

所以利用孩子兄弟表示法可以将树转化为二叉树。这两者可以进行互换。
树可以存在先序遍历与后序遍历,即根孩子1孩子2…,孩子1孩子2…根。
那么树的先序遍历可以对应于转换后的二叉树先序遍历。
树的后序遍历对应于转换后的二叉树的中序遍历。

树也可以层次遍历,依然使用队列实现。

同理森林为m个不相关的树组成的,可以认为这几个树之间为兄弟关系,那么也可以将森林转换为二叉树。
森林也可以进行先序后序遍历,即先序遍历第一颗树,然后再换一个树先序遍历,知道全部结束。
后序遍历逻辑相同。
所以森林也可以对应于二叉树的先序与中序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值